Окна с меню и панелью инструментов

okna s menju i panelju instrumentov Экскурсия по tkinter, часть 2

Помимо меню, отображаемого в верхней части, окна часто содержат ряд кнопок в нижней части. Этот нижний ряд кнопок обычно называют панелью инструментов, и он нередко содержит кнопки для выполнения наиболее часто используемых операций, присутствующих в главном меню. С помощью библиотеки tkinter добавить в окно панель инструментов достаточно просто: нужно прикрепить кнопки (и другие виджеты) к фрейму, прикрепить фрейм к нижней границе окна и определить для него возможность растягивания только в горизонтальном направлении. Это просто очередная реализация иерархической структуры графического интерфейса, однако нужно следить, чтобы панели инструментов (и строки меню, основанные на фреймах) прикреплялись раньше других виджетов, чтобы при сжатии окна сначала обрезались виджеты, находящиеся в середине экрана, — обычно бывает желательно, чтобы панели инструментов и полосы меню имели приоритет перед другими виджетами.

В примере 9.8 представлен один из способов добавления панели инструментов в окно. Он демонстрирует также, как добавлять изображения в пункты меню (присвоить атрибуту image ссылку на объект PhotoImage) и как делать пункты меню недоступными для выбора, изображая их в серых тонах (вызвать метод меню entryconfig, передав ему индекс отключаемого пункта; отсчет начинается с 1). Обратите внимание, что объекты PhotoImage сохраняются в виде списка — напомню, что в отличие от других виджетов, они будут утеряны, если не сохранить ссылки на них (загляните в главу 8, если вам требуется освежить память).

Пример 9.8. PP4E\Gui\Tour\menuDemo.py

#!/usr/local/bin/python

главное меню окна в стиле Tk8.0

строка меню и панель инструментов прикрепляются к окну в первую очередь, fill=X (прикрепить первым = обрезать последним); добавляет изображения в элементы меню; смотрите также: add_checkbutton, add_radiobutton

from tkinter import * # импортировать базовый набор виджетов

from tkinter.messagebox import * # импортировать стандартные диалоги

class NewMenuDemo(Frame): # расширенный фрейм

def __init__(self, parent=None): # прикрепляется к корневому окну? Frame.__init__(self, parent) # вызвать метод суперкласса self.pack(expand=YES, fill=BOTH) self.createWidgets() # прикрепить фреймы/виджеты

self.master.title(“Toolbars and Menus”) # для менеджера окон self.master.iconname(“tkpython”) # текст метки при свертывании

def createWidgets(self):

self.makeMenuBar()

self.makeToolBar()

L = Label(self, text=’Menu and Toolbar Demo’)

L.config(relief=SUNKEN, width=40, height=10, bg=’white’) L.pack(expand=YES, fill=BOTH)

def makeToolBar(self):

toolbar = Frame(self, cursor=’hand2’, relief=SUNKEN, bd=2) toolbar.pack(side=BOTTOM, fill=X)

Button(toolbar, text=’Quit’, command=self.quit ).pack(side=RIGHT) Button(toolbar, text=’Hello’, command=self.greeting).pack(side=LEFT)

def makeMenuBar(self):

self.menubar = Menu(self.master)

self.master.config(menu=self.menubar) # master=OKHO верхнего уровня self.fileMenu() self.editMenu()

self.imageMenu()

def fileMenu(self):

pulldown = Menu(self.menubar)

pulldown.add_command(label=’Open…’, command=self.notdone) pulldown.add_command(label=’Quit’, command=self.quit) self.menubar.add_cascade(label=’File’, underline=0, menu=pulldown)

def editMenu(self):

pulldown = Menu(self.menubar)

pulldown.add_command(label=’Paste’, command=self.notdone) pulldown.add_command(label=’Spam’, command=self.greeting) pulldown.add_separator()

pulldown.add_command(label=’Delete’, command=self.greeting) pulldown.entryconfig(4, state=DISABLED) self.menubar.add_cascade(label=’Edit’, underline=0, menu=pulldown)

def imageMenu(self):

photoFiles = (‘ora-lp4e.gif’, ‘pythonPowered.gif’,
‘python_conf_ora.gif’)

pulldown = Menu(self.menubar) self.photoObjs = [] for file in photoFiles:

img = PhotoImage(file=’../gifs/’ + file) pulldown.add_command(image=img, command=self.notdone) self.photoObjs.append(img) # сохранить ссылку

self.menubar.add_cascade(label=’Image’, underline=0, menu=pulldown)

def greeting(self):

showinfo(‘greeting’, ‘Greetings’) def notdone(self):

showerror(‘Not implemented’, ‘Not yet available’)

def quit(self):

if askyesno(‘Verify quit’, ‘Are you sure you want to quit?’): Frame.quit(self)

if __name__ == ‘__main__’: NewMenuDemo().mainloop() # если запущен как

# самостоятельный сценарий

Если запустить этот сценарий, он сначала создаст интерфейс, изображенный на рис. 9.10. На рис. 9.11 изображено это же окно после того как оно было несколько растянуто, с оторванным меню Image и выбранным меню Edit. Панель инструментов в нижней части окна растягивается вместе с окном только по горизонтали. Обратите также внимание, что этот сценарий изменяет форму указателя мыши, когда он находится над панелью инструментов. Поэкспериментируйте с ним самостоятельно, чтобы получить более полное представление о том, как он действует.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий