Автор оригинала: Pankaj Kumar.
Привет всем! В нашем предыдущем разделе учебника по Tkinter мы рассмотрели текстовый виджет Tkinter . Давайте теперь рассмотрим пример использования диспетчера сетки Tkinter.
Но у вас может возникнуть вопрос, особенно после того, как вы увидели много людей, использующих pack
manager.
Зачем использовать Tkinter Grid Manager?
В наших предыдущих уроках мы использовали pack geometry manager для управления геометрией нашего приложения. Но заставить его работать плавно с большим количеством объектов-сложная задача.
Поэтому Tkinter представила других менеджеров по упаковке, чтобы сделать нашу жизнь немного проще, а также иметь некоторую гибкость в том, когда и что использовать.
Менеджер сетки Tkinter на самом деле самый простой в освоении и наиболее рекомендуется, если вы начинаете создавать приложения Tkinter.
Теперь, когда мы рассмотрели это, давайте перейдем к фактическому использованию диспетчера сетки в нашем приложении!
ПРИМЕЧАНИЕ : Никогда не используйте несколько менеджеров упаковки в одном приложении Tkinter. Это приведет к непреднамеренным ошибкам и вообще не рекомендуется. Используйте только один менеджер упаковки для одного приложения.
Использование диспетчера геометрии сетки Tkinter
Давайте разработаем нижеприведенный макет с помощью диспетчера сетки.
Этот макет будет иметь два виджета ввода , с меткой для каждого, и виджет кнопки ниже.
Мы также добавим изображение справа и виджет кнопки для изображения.
В то время как этим типом макета трудно управлять с помощью pack
, мы можем легко сделать это с помощью grid
!
Шаги достаточно просты. Нам просто нужно создать все необходимые виджеты и сообщить менеджеру grid
, как их разместить.
Сначала мы создадим наш главный объект.
import tkinter as tk master = tk.Tk()
Теперь давайте сначала создадим две метки, так как они нужны нам с самой левой стороны, и скажем менеджеру grid
разместить их на соответствующем номере строки.
Нам нужны метки с номером столбца 0, индексированные номерами строк 0 и 1. После создания меток мы можем напрямую упаковать их с помощью grid
с помощью:
label_object.grid(row, col)
Таким образом, мы можем напрямую записать его следующим образом:
tk.Label(master, text="Label 1").grid(row=0, column=0) tk.Label(master, text="Label 2").grid(row=1, column=0)
Теперь давайте добавим запись для каждой из двух меток.
e1 = tk.Entry(master) e2 = tk.Entry(master)
Мы создали объекты ввода, но теперь нам нужно указать grid
, чтобы поместить их в соответствующее положение.
Просто вызовите entry_obj.grid()
! Это похоже на пакет, но в целом гораздо более плавно в использовании.
e1.grid(row=0, column=1) e2.grid(row=1, column=1)
После этого мы можем добавить наш основной цикл tkinter, используя tk.mainloop()
.
Я опубликую полный код до этого момента.
import tkinter as tk # Create the master object master = tk.Tk() # Create the label objects and pack them using grid tk.Label(master, text="Label 1").grid(row=0, column=0) tk.Label(master, text="Label 2").grid(row=1, column=0) # Create the entry objects using master e1 = tk.Entry(master) e2 = tk.Entry(master) # Pack them using grid e1.grid(row=0, column=1) e2.grid(row=1, column=1) # The mainloop tk.mainloop()
Выход
Хорошо! Похоже, это работает, как и ожидалось. Теперь давайте добавим к нему кнопку, прямо ниже!
button1 = tk.Button(master, text="Button 1") button1.grid(columnspan=2, row=2, column=0)
Теперь мы прикрыли нашу левую сторону.
Давайте добавим изображение и еще одну кнопку с правой стороны.
Как мы обсуждали вопросы отображения изображения в нашем предыдущем уроке , мы должны держать ссылку на Фотоизображение объект, чтобы избежать автоматической сборки мусора!
from PIL import Image, ImageTk # Create the PIL image object image = Image.open("debian.png") photo = ImageTk.PhotoImage(image) # Create an image label img_label = tk.Label(image=photo) # Store a reference to a PhotoImage object, to avoid it # being garbage collected! This is necesary to display the image! img_label.image = photo img_label.grid(row=0, column=2)
Наконец, давайте добавим кнопку внизу.
# Create another button button2 = tk.Button(master, text="Button 2") button2.grid(columnspan=2, row=2, column=2)
Теперь я опубликую полную программу здесь.
import tkinter as tk from PIL import Image, ImageTk # Create the master object master = tk.Tk() # Create the label objects and pack them using grid tk.Label(master, text="Label 1").grid(row=0, column=0) tk.Label(master, text="Label 2").grid(row=1, column=0) # Create the entry objects using master e1 = tk.Entry(master) e2 = tk.Entry(master) # Pack them using grid e1.grid(row=0, column=1) e2.grid(row=1, column=1) button1 = tk.Button(master, text="Button 1") button1.grid(columnspan=2, row=2, column=0) # Create the PIL image object image = Image.open("debian.png") photo = ImageTk.PhotoImage(image) # Create an image label img_label = tk.Label(image=photo) # Store a reference to a PhotoImage object, to avoid it # being garbage collected! This is necesary to display the image! img_label.image = photo img_label.grid(row=0, column=2) # Create another button button2 = tk.Button(master, text="Button 2") button2.grid(columnspan=2, row=2, column=2) # The mainloop tk.mainloop()
Выход
Наконец-то мы закончили наш макет! И это было так же просто, как просто создать виджеты и сказать grid
, чтобы разместить их в правильном положении!
Вывод
В этом уроке мы узнали, как добавлять виджеты в наше приложение Tkinter и создавать макеты с помощью диспетчера геометрии сетки Tkinter.
Оставайтесь с нами, чтобы узнать больше контента Tkinter!