Все повече и повече джаджи

Тази история следва серията потребителски интерфейси. Ако сте пропуснали последната история на Tkinter, можете да я намерите тук:



В предишната история говорих за някои джаджи на Tkinter, които можете да използвате във вашите приложения:

  • Кадър
  • Текст
  • Бутон за отметка
  • Плъзгач
  • Спинбокс

Днес ще говоря за някои други полезни джаджи! Нека не губим повече време и да стигнем до същината на въпроса.

Ако искате, можете да намерите кода на историята в GitHub. В противен случай кодът, с който започваме, е:

import tkinter as tk
from tkinter import ttk

main_window = tk.Tk()
main_window.title("Widgets")
main_window.geometry("400x400")

main_window.grid_columnconfigure(0, weight=1)
main_window.grid_columnconfigure(1, weight=1)
main_window.grid_columnconfigure(2, weight=1)

Плъзгач

Графичният модул на лентата за превъртане ви позволява да прикачите лента за превъртане към всеки модул, за да видите цялото съдържание на модула, когато е по-голямо от наличното пространство.

Тази джаджа е наистина независима. За да го използвате, първо трябва да инициализирате приспособление за лента за превъртане, след което да го прикачите към съществуващо приспособление.

Първият параметър при инициализиране на лента за превъртане е контейнерът, след което можете да предоставите някои аргументи за ключови думи:

  • ориентиране: ориентацията на превъртане („вертикална“ или „хоризонтална“).
  • команда: командата на изпълнимия модул. През повечето време това ще бъде джаджата, която искате да направите с възможност за превъртане.

Ето един пример:

scrollable_text_area = tk.Text(main_window, width=40, height=10)
scrollable_text_area.grid(row=0, column=0, columnspan=2, sticky=tk.EW, pady=5, padx=5)

scrollbar = ttk.Scrollbar(main_window, orient=tk.VERTICAL, command=scrollable_text_area.yview)
scrollbar.grid(row=0, column=2, sticky=tk.NS, pady=5, padx=5)

Липсва едно нещо: приспособлението за превъртане трябва да комуникира с лентата за превъртане, за да актуализира състоянието си. Правим го по следния начин:

scrollable_text_area["yscrollcommand"] = scrollbar.set

За хоризонтално превъртане замествате „y“ с „x“ навсякъде.

Разделител

Тази джаджа ви позволява да показвате линия между джаджи.

Отнема само два параметъра: контейнера и ориентацията („хоризонтална“ или „вертикална“).

Например, можем да добавим разделител към нашия прозорец по следния начин:

separator = ttk.Separator(main_window, orient=tk.HORIZONTAL)
separator.grid(row=1, column=0, columnspan=3, sticky=tk.EW, pady=5, padx=5)

Радио бутон

Радио бутоните ви позволяват да изберете един и само един избор между множество избори.

Radiobutton приема контейнера като първи параметър. След това можете да предоставите други параметри:

  • текст: текстът, показан до бутона за избор.
  • променлива: променлива, чиято стойност е равна на стойността, избрана от бутоните за избор.
  • стойност: стойността, присвоена на променливата, когато е избран радиобутонът.

Нека добавим няколко радио бутона към нашия прозорец.

selected_value = tk.StringVar()
radio_button_1 = ttk.Radiobutton(main_window, text="Option 1", value="Option 1", variable=selected_value)
radio_button_1.grid(row=2, column=0, sticky=tk.W, pady=5, padx=5)

radio_button_2 = ttk.Radiobutton(main_window, text="Option 2", value="Option 2", variable=selected_value)
radio_button_2.grid(row=2, column=1, sticky=tk.W, pady=5, padx=5)

radio_button_3 = ttk.Radiobutton(main_window, text="Option 3", value="Option 3", variable=selected_value)
radio_button_3.grid(row=2, column=2, sticky=tk.W, pady=5, padx=5)

Ще добавя и малък бутон за вмъкване на текст в нашата текстова област в зависимост от избрания радио бутон.

display_button = ttk.Button(main_window, text="Display", command=lambda: scrollable_text_area.insert(tk.END, f"{selected_value.get()} has been selected"))
display_button.grid(row=3, column=0, columnspan=3, sticky=tk.EW, pady=5, padx=5)

Комбобокс

Combobox ви позволява да изберете една стойност в списък. Освен това ви позволява да въведете персонализирана стойност.

Както всички джаджи, първият параметър е контейнерът. След това можете да предоставите параметър textvariable, който ще съдържа текста, избран в падащото поле.

Можете да добавите списък със стойности, като използвате combobox["values"] = ("A", "B", "C").

Можете също така да взаимодействате с падащия списък, като използвате combobox.get() или combobox.set(), за да получите/зададете неговата стойност.

Нека добавим разгъващ се списък към нашия прозорец. Ще го направим само за четене:

combobox = ttk.Combobox(main_window, textvariable=combobox_value)
combobox["values"] = ("Option 1", "Option 2", "Option 3")
combobox["state"] = "readonly"
combobox.grid(row=4, column=0, columnspan=3, sticky=tk.EW, pady=5, padx=5)

Списъчно поле

Listbox е изпълним модул, използван за показване на списък с елементи. Можете също така да разглеждате елементите и да избирате един или няколко наведнъж.

Аргументите на ключовите думи за тази джаджа са:

  • listvariable: свързва към Tkinter.Variable.
  • височина: броят елементи, показани без необходимост от превъртане.
  • selectmode: задайте режима за обработка на избора на елементи в списъка.

listvariable се използва за попълване на вашия списък с елементи (ще видим как в пример по-късно).

Има няколко режима на избор:

  • ПРЕГЛЕД:позволява един избор. Изберете елемент и го плъзнете на друг ред и изборът ще следва мишката.
  • РАЗШИРЕНО: изберете всяка съседна група от елементи наведнъж, като щракнете върху първия елемент и плъзнете до последния ред.
  • ЕДИНЕН: позволява единична селекция и деактивира плъзгането с мишката.
  • МНОГО: позволява множество селекции и щракването върху всеки ред превключва дали е избран или не.
items = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"]
listbox = tk.Listbox(main_window, listvariable=tk.StringVar(value=items), height=3, selectmode=tk.MULTIPLE)
listbox.grid(row=5, column=0, columnspan=3, sticky=tk.EW, pady=5, padx=5)

LabelFrame

Тази джаджа ви позволява да групирате свързани джаджи.

Първият параметър за него е контейнерът, а вторият е показваният текст. Можете също да посочите позицията на етикета, като използвате параметъра labelanchor („nw“, „ne“, „sw“ и т.н.…).

Нека добавим група с някои бутони към нашия прозорец:

label_frame = ttk.LabelFrame(main_window, text="Label Frame")
label_frame.grid(row=6, column=0, columnspan=3, sticky=tk.EW, pady=5, padx=5)

label_frame.grid_columnconfigure(0, weight=1)
label_frame.grid_columnconfigure(1, weight=1)
label_frame.grid_columnconfigure(2, weight=1)

button1 = ttk.Button(label_frame, text="Button 1")
button1.grid(row=0, column=0, sticky=tk.EW, pady=5, padx=5)

button2 = ttk.Button(label_frame, text="Button 2")
button2.grid(row=0, column=1, sticky=tk.EW, pady=5, padx=5)

button3 = ttk.Button(label_frame, text="Button 3")
button3.grid(row=0, column=2, sticky=tk.EW, pady=5, padx=5)

Sizegrip

Нека завършим тази история с най-лесната за използване джаджа: Sizegrip. Това е джаджа, която ви позволява да преоразмерите прозореца си чрез плъзгане и пускане.

Просто посочвате неговия контейнер и можете да го използвате директно, освен ако не използвате мрежово оформление. В този случай трябва да конфигурирате размерите на колони и редове. Направих го в началото на историята, така че сега можем просто да добавим джаджата, да я поставим и тя ще работи. Освен това трябва да се уверите, че прозорецът ви е конфигуриран да може да променя размера.

sizegrip = ttk.Sizegrip(main_window)
sizegrip.grid(row=7, column=2, sticky=tk.SE, pady=5, padx=5)

Последна бележка

Все още има някои джаджи за гледане. Те могат да бъдат малко сложни за разбиране, така че ще ги видим в трета част.

Междувременно имате добър арсенал от джаджи, за да се обучите да работите с Tkinter.

За да сте сигурни, че няма да пропуснете третата част, не се колебайте да ме последвате!

Можете да намерите другите истории от тази поредица тук:



За да разгледате повече от моите истории за Python, щракнете тук!

Ако ви е харесала историята, не забравяйте да ръкопляскате и може би ме последвайте, ако искате да изследвате повече от съдържанието ми :)

Можете също да се абонирате за мен по имейл, за да получавате известия всеки път, когато публикувам нова история, просто щракнете тук!

Ако все още не сте абонирани за Medium и искате да ме подкрепите или да получите достъп до всичките ми истории, можете да използвате моята връзка: