Главная страница
Навигация по странице:

  • Контекстные меню и всплывающие окна

  • Глава Меню и диалоговые окна10

  • Используем сочетания клавиш

  • …и нет задач 20111 Графика в Python

  • Глава Графика в Python11

  • Глава Графика в Python11 204 Рис. 11.3.

  • Шуман Х. - Python для детей - 2019. # Startwerte festlegen Red (255,0,0)


    Скачать 5.95 Mb.
    Название# Startwerte festlegen Red (255,0,0)
    Дата10.03.2023
    Размер5.95 Mb.
    Формат файлаpdf
    Имя файлаШуман Х. - Python для детей - 2019.pdf
    ТипДокументы
    #977830
    страница14 из 22
    1   ...   10   11   12   13   14   15   16   17   ...   22
    Глава
    Меню и диалоговые окна
    10
    194
    if Name != "":
    saveDiagnose(Name)
    def closeAll() :
    Window.destroy()
    # Основная программа
    Window = Tk()
    Window.title("Психолог")
    Window.minsize(width=500, height=330)
    initMenu()
    loadDiagnose("diagnose.txt")
    # Определение состояния
    Display = []
    Border = []
    for pos in range(0,3) :
    Display.append(Label(Window, text=State[pos]))
    Display[pos].place(x=20, y=10+pos*90, width=460, height=30)
    Border.append(Frame(Window, borderwidth=2, relief="groove"))
    Border[pos].place(x=20, y=40+pos*90, width=460, height=50)
    # Ввод, ответ и ползунковый регулятор
    Input = Entry(Border[0])
    Input.place(x=10, y=10, width=440, height=30)
    Answer = Label(Border[1])
    Answer.place(x=10, y=10, width=440, height=30)
    Slider = Scale(Border[2], orient="horizontal", command=scaleValue)
    Slider.config(from_=0, to=Max, length=430, showvalue=0)
    Slider.pack(pady=10)
    # Кнопки "Готово" и "Заново"
    Button1 = Button(Window, text="Заново", command=button1Click)
    Button1.place(x=120, y=285, width=120, height=30)
    Button2 = Button(Window, text="Готово", command=button2Click)
    Button2.place(x=260, y=285, width=120, height=30)
    # Цикл событий
    Window.mainloop()
    Теперь ты можешь присваивать файлам любые имена, а также создать целую коллекцию сеансов.
    Контекстные меню
    и всплывающие окна
    Всегда что-то можно улучшить. Ты уже мог заметить, что многие разработчики программного обеспечения выпус- кают обновления для своих продуктов через определенные

    Контекстные меню и всплывающие окна
    195
    промежутки времени. Иногда, к сожалению, ухудшая таким образом продукт.
    Мы скромно добавим новую версию меню в наш проект. Ты знаешь из операционной системы Windows, что если щелк- нуть правой кнопкой мыши, всплывет контекстное меню, которое не показывается в строке меню. Никто не возража- ет, если мы сделаем в новой версии программы-психолога такую же «штучку»?
    Прежде всего подобное меню похоже на обычное меню (⇒
    psych7.py):
    def initPopup() :
    global ContextMenu
    ContextMenu = Menu(Window, tearoff = 0)
    ContextMenu.add_command(label="Открыть", command=openFile)
    ContextMenu.add_command(label="Сохранить", command=saveFile)
    ContextMenu.add_command(label="Выход", command=closeAll)
    Только в программе оно не отображается в виде строки меню и не зафиксировано в конкретной позиции окна. По- чему же ContextMenu является глобальным? Потому что оно нам необходимо в другой функции.
    Всплывающие меню называются контекстными, потому что их содержимое обычно связано с текущей средой (со- стоянием) программы.
    Всплывающее меню, выпадающее меню? Оно появляется где-то посреди интерфейса, поэтому всплывающее. Пункт меню свернут, и команды выпадают из него, поэтому это выпадающее меню.
    Фактически любые меню просто полностью появляются или пол- ностью исчезают.
    После того как меню создано, ты должен проверить, что оно открывается щелчком правой кнопки мыши. За это от- вечает функция, показанная ниже (⇒ psych7.py):
    def openMenu(event):
    global ContextMenu
    ContextMenu.post(event.x_root, event.y_root)
    Метод post() инициирует открытие меню в той позиции, где была нажата кнопка мыши. Ты должен использовать параметры x_root и y_root вместо x и y для правильной ин- терпретации положения мыши.

    Глава
    Меню и диалоговые окна
    10
    196
    Соответствующая привязка создает указанные две строки непосредственно под функцией initMenu():
    initPopup()
    Window.bind("", openMenu)
    Сначала создается контекстное меню, затем оно связыва- ется с помощью метода bind() с событием, которое проис- ходит при щелчке правой кнопкой мыши в любой позиции
    (окна программы).
    Параметр определяет левую кнопку мыши, па- раметр – правую ( – среднюю, если она есть).
    Этого достаточно, так как контекстное меню использует уже существующие функции стандартного меню.
    Дополни версию своей программы-психолога указанными выше строками кода, а затем проверь все команды в обоих меню. (Или используй файлы примеров, скачанные с сайта dmkpress.com
    .)
    Команда в меню
    Справка по-прежнему остается нерабо- чей, но это легко изменить. Для начала нам нужен пара- метр command для этой команды меню:
    Helpmenu.add_command(label="О программе", command=showInfo)
    Затем, естественно, необходимо определить соответствую- щую функцию события (⇒ psych8.py):
    def showInfo() :
    messagebox.showinfo("О программе", "Персональный психолог")
    Конечно, ты можешь написать все, что угодно. Но не забудь, что нужно импортировать модуль messagebox:
    from tkinter import messagebox
    Ты познакомился с новым интересным способом вывода сообщения (в отдельном окне).
    Было бы хорошо, если бы при завершении работы програм- ма спрашивала, нужно ли сохранить данные сеанса. Так обычно и происходит в правильном приложении.
    Все, что нам нужно сделать, – это дополнить кодом метод closeAll()
    (⇒ psych8.py):

    Контекстные меню и всплывающие окна
    197
    def closeAll() :
    if messagebox.askyesno("Выход", "Сохранить данные?") :
    saveDiagnose("backup.txt")
    Window.destroy()
    Вновь появляется окно сообщения. Но если функция show­
    info()
    просто отображает текст и кнопку
    OK для закрытия окна, функция askyesno() открывает окно с двумя кнопками на выбор. Тут ты можешь ответить на запрос с помощью кнопки
    Да или Нет (рис. 10.5).
    Рис. 10.5.Диалоговое окно с запросом сохранения данных
    Не следует забывать, что есть, конечно, и другие возможности для использования такого диалогового окна. К примеру, метод askok­
    cancel()
    отображает кнопки
    OK и Отмена.
    Условная конструкция if выполняется при нажатии кнопки
    Да. Затем данные сохраняются в файл под новым именем в качестве резервной копии. Разумеется, ты можешь вы- звать функцию saveFile().
    Теперь наша программа стала довольно удобной, но все еще не хватает одной мелочи: возможности выходить из программы не только с помощью команды
    Выход меню, но и щелчком мыши по кнопке закрытия программы (т. е. по маленькому значку × в строке заголовка). Для этого надо написать новую функцию.
    Нам нужна связь между новым событием и функцией closeAll()
    . Событие называется WM_DELETE_WINDOW и исполь- зуется в самом конце исходного кода (перед объявлением mainloop
    ):
    Window.protocol("WM_DELETE_WINDOW", closeAll)
    Метод bind не сработает, поскольку он вмешивается в про- цесс событий Windows: эта операционная система обычно

    Глава
    Меню и диалоговые окна
    10
    198
    берет под контроль изменения: открытие или закрытие окна. Здесь же хотим вмешаться мы и взять на себя «про- токол» управления – т. н. метод protocol(). Он направляет событие закрытия согласованному методу, которым мы управляем. (Если ты не укажешь инструкцию Window.proto­
    col()
    , то не сможешь закрыть окно щелчком мыши по знач- ку × в строке заголовка.)
    Используем сочетания клавиш
    Почти каждое меню имеет собственные сочетания клавиш, которые ты можешь использовать вместо выбора команд меню мышью. В нашем случае это может быть сочетание клавиш
    Ctrl+O для открытия файла и Ctrl+S для сохране- ния. Кроме того, ты можешь добавить сочетание клавиш
    Ctrl+X, чтобы закрывать программу (или Ctrl+Q).
    Такие события клавиатуры могли бы выглядеть так:
    Window.bind('', openFile)
    Window.bind('', saveFile)
    Window.bind('', closeAll)
    Здесь задействованы три функции, которые мы использу- ем для соответствующих пунктов меню. К сожалению, все не так просто, потому что когда вызывается метод bind(), функция события нуждается в параметре события. Вспом- ни функцию, которую мы подключили к событию для контекстного меню:
    def openMenu(event) :
    Поэтому нам нужно будет связать все три функции (openFile, saveFile и closeAll) с одним параметром, но тогда они боль- ше не подходят для меню. По этой причине мы используем отдельную функцию здесь только для событий клавиа туры
    (⇒ psych9.py):
    def getShotcut(event) :
    if event.keysym == "o" :
    openFile()
    if event.keysym == "s" :
    saveFile()
    if event.keysym == "x" :
    closeAll()

    Используем сочетания клавиш
    199
    event принимает событие, keysym определяет, какая клавиша
    (кроме
    Ctrl) была нажата. И в зависимости от того, являет- ся ли эта клавиша буквой
    O, S или X, задействуется функ- ция события, которая также соответствует меню. Конечно, только если ты изменишь связи следующим образом (⇒
    psych9.py):
    Window.bind('', getShotcut)
    Window.bind('', getShotcut)
    Window.bind('', getShotcut)
    Чтобы увидеть сочетания клавиш рядом с пунктами меню, ты должен дополнить методы add_command (⇒ psych9.py):
    Filemenu.add_command(label="Открыть", command=openFile, \ accelerator="Ctrl+O")
    Filemenu.add_command(label="Сохранить", command=saveFile, \ accelerator="Ctrl+S")
    Filemenu.add_command(label="Выход", command=closeAll, \ accelerator="Ctrl+X")
    Для каждой команды параметр accelerator отображает со- ответствующее сочетание клавиш справа от имени коман- ды (рис. 10.6).
    Рис. 10.6.Отображение сочетаний клавиш в меню

    Глава
    Меню и диалоговые окна
    10
    200
    Подведение итогов
    На этом мы заканчиваем работу над приложением-психо- логом. Конечно, программа все еще не идеальна, но я остав- ляю ее на тебя для продолжения экспериментов. Однако ты можешь и просто насладиться плодами своего труда. Давай посмотрим, что мы узнали:
    Код
    Описание add_cascade()
    Добавляет пункт в строку меню add_command()
    Добавляет команду в список меню label=
    Отображает текст в меню tearoff=
    Отображает/скрывает пунктирную линию в меню post()
    Позиционирует и открывает меню messagebox
    Подборка методов для всплывающих окон showinfo()
    Отображает окно с простым сообщением (для оповещения)
    askokcancel()
    Отображает окно сообщения с кнопками
    ОК и Отмена
    askyesno()
    Отображает окно сообщения с кнопками
    Да и Нет
    filedialog
    Подборка методов для диалоговых окон askopenfilename()
    Отображает диалоговое окно для открытия файла asksaveasfilename()
    Отображает диалоговое окно для сохранения файла filetypes=
    Ограничивает отображение указанных типов файлов protocol()
    Перехватывает управление событиями Windows destroy()
    Закрывает и удаляет окно


    201
    11
    Графика в Python
    Хотя мы уже имели дело с графическими элементами в tkinter, но в основном это был текст. А можно ли рисо- вать в Python? Если этому научиться, ты узнаешь о некото- рых интересных возможностях tkinter, с помощью которых можно отображать в окне довольно сложную графику. Это также зависит от того, как ты будешь использовать пред- ставленные методы.
    Итак, в этой главе ты узнаешь:
    
    как работать с холстом – компонентом Canvas;
    
    как рисовать линии, прямоугольники и эллипсы;
    
    как отображать в окне разноцветный текст;
    
    как менять цвет и шрифт;
    
    кое-что о черепашьей графике.
    Точки и координаты
    Когда дело доходит до графики, нужно кое-то пояснить о системе координат. Ты сейчас вспомнил о своем учителе математики, как он стоит у доски, рассказывая что-то об осях x и y. Поэтому я не буду слишком подробно объяснять эту тему.
    Все, что ты видишь на мониторе, состоит из множества ма- леньких точек, называемых пикселями. Количество этих

    Глава
    Графика в Python
    11
    202
    пикселей называется разрешением. Ширина и высота изо- бражения на мониторе могут превышать 2000 пикселей.
    Чтобы увидеть изображение, на каждом компьютере есть так называемая видеокарта. Она способна обрабатывать изображения с несколькими миллионами цветов. Разреше- ние, которое ты видишь на экране, зависит не только от ви- деокарты. Разумеется, экран тоже должен быть достаточно технологичным, чтобы отображать высокое разрешение.
    Чтобы компьютер мог знать, где разместить точку на экра- не, когда нужно отобразить какое-либо изображение, об- ласть вывода представляется как невидимая мелкая сетка.
    Каждая точка описывается двумя числами. Они указывают расстояние от фиксированной начальной точки. В Python
    (а также в большинстве графических редакторов) она нахо- дится в верхнем левом углу экрана (рис. 11.1).
    Ось
    х
    Ось y
    Рис. 11.1.Система координат на экране
    Эта точка также называется началом координат и имеет ко- ординаты х = 0 и у = 0. Если отсчитывать от начала коорди- нат вправо, то будешь перемещаться по оси х. Также можно сказать про перемещение горизонтально или по горизон- тальной оси. Но поскольку математики назвали ее осью х, компьютерщики так и оставили это название.
    Если опускаться вниз от начала координат, ты будешь дви- гаться по оси y. Ее можно было бы назвать вертикальной осью, но не говори так: математики назвали ее осью y. (Кста- ти, жирная точка на рис. 11.1 находится в позиции (4 | 3), что можно выразить как x = 4 и y = 3.)

    Точки и координаты
    203
    Вспомнил урок математики? Система координат с осями x и y выглядела совсем иначе! В центре было так называемое пересечение, где соединялись оси x и y (отсюда и пересече- ние координат) (рис. 11.2).
    Ось
    х
    Ось y
    Рис. 11.2.Система координат из урока математики
    (Опять же, жирная точка имеет координаты (4 | 3), поэтому
    x = 4, y = 3.)
    Компьютерщики все перевернули и сказали: зачем нам от- рицательные значения осей? И вообще, для нас логичнее начинать так, как мы пишем: вверху слева.
    Как и в математике, значения по оси x увеличиваются слева направо. Но, в отличие от математики, значения по оси y увеличиваются сверху вниз, а не наоборот.
    Осталась лишь перевернутая буква «L» от математической координатной оси.
    Кроме двух названных выше осей, существует также ось z. Она отвечает за глубину. Но где на экране глубина? Это как раз проб- лема оси z: на самом деле все фотографии являются двухмер- ными, т. е. используют только ширину (x) и высоту (y). А везде, где бы мы не находились, есть еще третье измерение – глубина (z)
    (рис. 11.3).

    Глава
    Графика в Python
    11
    204
    Рис. 11.3. Двухмерные и трехмерные объекты
    Чтобы получить изображения, которые выглядят так, как объем- ные, есть специальные программы, которые определяют, как вы- глядит третье измерение в изображении. Новейшие видеокарты гарантируют, что на экране все будет выглядеть качественно и ра- ботать быстро. Поэтому сегодня, например, в компьютерных гон- ках машины и дороги действительно выглядят объемно, и с каж- дым движением руля экран приспосабливается мгновенно.
    Первое изображение
    Хватит теории! Настало время перейти к практике! Итак, первая графическая программа. В качестве основы нам по- надобится только окно с кнопкой. Первая попытка напи- сать программу будет выглядеть так (⇒ graphic0.py):
    # Графика в Python from tkinter import *
    # Функция события def buttonClick() :
    pass
    # Основная программа
    Window = Tk()
    Window.title("Графика")
    Window.config(width=500, height=330)
    Button = Button(Window, text="Посмотреть!", command=buttonClick)
    Button.place(x=190, y=150, width=120, height=30)
    Window.mainloop()
    Здесь у нас есть все необходимое для создания программы на основе библиотеки tkinter. Кнопка в центре уже настрое- на на функцию события, несмотря на то что оно еще не на- строено. Окно пока все еще пустое (11.4).

    Первое изображение
    205
    Рис. 11.4.Базовое приложение на основе библиотеки tkinter
    Чтобы что-то нарисовать в окне, нам нужен компонент Can­
    vas
    , что означает не что иное, как холст для рисования. Мы можем создать его и поместить в окно:
    Graphic = Canvas(Window, width=500, height=330)
    Graphic.pack()
    Теперь у нас есть доступ к одному из методов, чтобы нари- совать, например, линии, прямоугольники или круги. Мы прописываем это в функцию, которая вызывается, когда мы нажимаем кнопку «Посмотреть!». Ниже представлен полный листинг программы (⇒ graphic1.py):
    # Графика в Python from tkinter import *
    # Размеры окна
    Breadth = 500
    Highness = 330
    # Функция события def buttonClick() :
    Graphic.create_rectangle(20, 20, Breadth-20, Highness-20)
    Graphic.create_oval(20, 20, Breadth-20, Highness-20)
    Graphic.create_line(Breadth/2, 20, Breadth/2, Highness-20)
    Graphic.create_line(20, Highness/2, Breadth-20, Highness/2)

    Глава
    Графика в Python
    11
    206
    # Основная программа
    Window = Tk()
    Window.title("Графика")
    Window.config(width=Breadth, height=Highness)
    Graphic = Canvas(Window, width=Breadth, height=Highness)
    Graphic.pack()
    Button = Button(Window, text="Посмотреть!", command=buttonClick)
    Button.place(x=Breadth/2-60, y=Highness/2-15, width=120, height=30)
    Window.mainloop()
    Создай новый файл и введи указанный выше исходный код.
    Затем запусти программу и нажми кнопку «Посмотреть!»
    (рис. 11.5).
    Рис. 11.5.Наша первая графическая программа
    И теперь давай более подробно рассмотрим, какие объекты возникают в результате работы функции события. Появля- ются прямоугольник, эллипс и две линии, которые пере- секаются. Все это выполняется с помощью объекта canvas.
    С помощью каких действий появляются эти объекты, ты можешь догадаться сам.
    Метод create_line() создает линию между двумя точками:
    create_line(xStart, yStart, xEnd, yEnd)

    Первое изображение
    207
    С помощью этого метода можно рисовать практически все виды графики. Когда дело касается прямоугольников или эллипсов, можно сделать это двумя другими способами:
    create_rectangle(xLeft, yTop, xRight, yBottom)
    create_oval(xLeft, yTop, xRight, yBottom)
    Указываются координаты верхнего левого и правого ниж- него углов. Они образуют (невидимую) прямоугольную область, в которую точно вписывается прямоугольник или эллипс (рис. 11.6).
    xLeft yTop xRight yBottom
    Рис. 11.6.Создание прямоугольника или эллипса
    Как ты мог заметить, я не просто работаю с целыми чис- лами в графической программе, но и создал две дополни- тельные переменные для ширины (Breadth) и высоты (High­
    ness
    ), которые затем я использую в соответствующих функ- циях. Преимущество: тебе не нужно изменять значения этих двух переменных, адаптация для методов происходит автоматически.
    В области рисования (Graphic), как и в случае с экраном, верхний левый угол начинается с точки с координатами
    x = 0 и y = 0. Я учитываю поля, поэтому мы прибавляем до- полнительные 20 пикселей. Разделив значение дополни- тельной переменной на 2, мы получаем ровно центр этой ширины или высоты. Так создается ровное пересечение без указания фиксированных координат:
    Graphic.create_line(Breadth/2, 0, Breadth/2, Highness)
    Graphic.create_line(0, Highness/2, Breadth, Highness/2)

    1   ...   10   11   12   13   14   15   16   17   ...   22


    написать администратору сайта