В первом сценарии пользовательского интерфейса (пример 12.18) для создания формы ввода использован менеджер компоновки pack и фреймы рядов с метками фиксированной длины, а клиент getfile выполняется как самостоятельная программа. Как мы узнали в главе 9, для расположения элементов на форме с тем же успехом можно просто использовать менеджер grid, а также импортировать и вызвать функцию, реализующую логику клиента, а не запускать самостоятельную программу. Это решение демонстрируется в примере 12.19.
Пример 12.19. PP4E\Internet\Sockets\getfilegui-2.py
то же самое, но с компоновкой по сетке и импортом с вызовом вместо компоновки менеджером pack и командной строки; непосредственные вызовы функций обычно выполняются быстрее, чем запуск файлов;
import getfile
from tkinter import *
from tkinter.messagebox import showinfo
def onSubmit():
getfile.client(content[‘Server’].get(), int(content[‘Port’].get()), content[‘File’].get())
showinfo(‘getfilegui-2’, ‘Download complete’)
box = Tk()
labels = [‘Server’, ‘Port’, ‘File’]
rownum = 0
content = {} for label in labels:
Label(box, text=label).grid(column=0, row=rownum)
entry = Entry(box)
entry.grid(column=1, row=rownum, sticky=E+W)
content[label] = entry rownum += 1
box.columnconfigure(0, weight=0) # сделать растягиваемым box.columnconfigure(1, weight=1)
Button(text=’Submit’, command=onSubmit).grid(row=rownum, column=0, columnspan=2)
box.title(‘getfilegui-2’)
box.bind(‘<Return>’, (lambda event: onSubmit())) mainloop()
Эта версия создает похожее окно (рис. 12.3), в нижнюю часть которого добавлена кнопка, выполняющая то же действие, что нажатие клавиши Enter, — она запускает процедуру клиента getfile. Вообще говоря, импорт и вызов функций (как в этом примере) происходит быстрее, чем выполнение команд, особенно при многократном выполнении. Сценарий getfile позволяет использовать его любым способом — как программу или как библиотеку функций.
Рис. 12.3. Сценарий getfilegui-2 в действии
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011