🐍 Π‘Π°ΠΌΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎ Python для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…. Π§Π°ΡΡ‚ΡŒ 20: ГрафичСский интСрфСйс Π½Π° Tkinter

РасскаТСм ΠΎ прСимущСствах ΠΈ нСдостатках Tkinter, ΠΈΠ·ΡƒΡ‡ΠΈΠΌ основы создания GUI ΠΈ разбСрСмся Π² особСнностях ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pack(), place() ΠΈ grid(). Π’ ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ – 10 практичСских Π·Π°Π΄Π°Π½ΠΈΠΉ ΠΏΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ GUI для Python-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

ГрафичСский интСрфСйс для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Python ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… GUI Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ:

  • Tkinter
  • wxPython
  • PyQt
  • PySide
  • Kivy
  • PyGTK

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· этих Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π΅ΡΡ‚ΡŒ свои прСимущСства ΠΈ нСдостатки. Волько ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ…, Tkinter, Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ поставку Python. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Tkinter Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΡΠ½ΠΎΠ³ΡΡˆΠΈΠ±Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ – это Π΅Π΅ СдинствСнный ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ минус. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π² Ρƒ Tkinter Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС, Ρ‡Π΅ΠΌ нСдостатков. Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°:

  • Максимально проста Π² ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΈ использовании.
  • Π˜ΠΌΠ΅Π΅Ρ‚ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ.
  • Помимо Π±Π°Π·ΠΎΠ²Ρ‹Ρ… элСмСнтов интСрфСйса, содСрТит Π΄Π²Π° ΠΌΠΎΡ‰Π½Ρ‹Ρ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° – Text (многострочноС тСкстовоС ΠΏΠΎΠ»Π΅ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ форматирования) ΠΈ Canvas («холст», Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ графичСскиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹).
  • Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ttk, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Π² распоряТСниС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π½Π°Π±ΠΎΡ€ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² – Combobox, Notebook, Treeview, Progressbar, Scale ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ интСрфСйс Π°Π΄Π°ΠΏΡ‚ΠΈΠ²Π½Ρ‹ΠΌ.
  • ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… – поэтому Π½Π° Π½Π΅ΠΉ ΠΌΡ‹ ΠΈ сосрСдоточимся.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° прилоТСния с Tkinter

Для создания простого ΠΎΠΊΠ½Π° прилоТСния Π² Tkinter Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

  • Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ import tkinter.
  • Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Tk, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ прилоТСния.
  • (ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) Π—Π°Π΄Π°ΠΉΡ‚Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° title() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Tk.
  • (ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) УстановитС Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° geometry() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Tk. ΠœΠ΅Ρ‚ΠΎΠ΄ geometry() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строковый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ "ΡˆΠΈΡ€ΠΈΠ½Π°xвысота".
  • Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ mainloop() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Tk, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ основной Ρ†ΠΈΠΊΠ» GUI прилоТСния.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт простоС ΠΎΠΊΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 250 Π½Π° 250 пиксСлСй с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ «МоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β»:

import tkinter as tk

# Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Tk
root = tk.Tk()

# Π—Π°Π΄Π°ΠΉΡ‚Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π°
root.title("МоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅")

# УстановитС Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π°
root.geometry("250x250")

# ЗапуститС основной Ρ†ΠΈΠΊΠ»
root.mainloop()
πŸπŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ Python
ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ PythonΒ»
🐍🧩 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python
Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Python для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ PythonΒ»

ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ Tkinter прилоТСния Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ:

  • Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ winfo_screenwidth() ΠΈ winfo_screenheight() для получСния ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ высоты экрана соотвСтствСнно.
  • ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ geometry() ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ x ΠΈ y, Ρ€Π°Π²Π½Ρ‹Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ высоты экрана Π·Π° минусом ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ высоты ΠΎΠΊΠ½Π° прилоТСния.

Код Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

import tkinter as tk

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ
root = tk.Tk()

# ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΈ высоту экрана
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

# ВычисляСм ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΎΠΊΠ½Π° прилоТСния
window_width = 500
window_height = 300
x = (screen_width // 2) - (window_width // 2)
y = (screen_height // 2) - (window_height // 2)
root.geometry(f"{window_width}x{window_height}+{x}+{y}")

# ЗапускаСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ
root.mainloop()

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠΊΠ½ΠΎ располоТСно Ρ‚ΠΎΡ‡Π½ΠΎ Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана:

Π Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ элСмСнтов интСрфСйса Π² Tkinter

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ интСрфСйса Π² Tkinter Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ. БущСствуСт Ρ‚Ρ€ΠΈ основных способа располоТСния Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π½Π° повСрхности ΠΎΠΊΠ½Π°: pack(), place() ΠΈ grid(). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ‚ свои прСимущСства ΠΈ нСдостатки, ΠΈ Π²Ρ‹Π±ΠΎΡ€ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ способа зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ситуации.

pack() – упорядочиваСт Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈΠ»ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ. Он прост Π² использовании, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (указания отступов, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ). ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для создания простых интСрфСйсов. НСдостаток – с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pack() ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сСтку ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ²: для этого Π½ΡƒΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ с place().

import tkinter as tk

root = tk.Tk()

label1 = tk.Label(root, text="Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования pack()")
label1.pack()

button1 = tk.Button(root, text="НаТми!")
button1.pack()

root.mainloop()

place() – позволяСт Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π² ΠΎΠΊΠ½Π΅. Π•Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ элСмСнты интСрфСйса. НСдостаток – ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠΊΠ½Π° ΠΈΠ»ΠΈ содСрТимого Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ располоТСниС элСмСнтов.

import tkinter as tk

root = tk.Tk()

label1 = tk.Label(root, text="Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования place()")
label1.place(x=5, y=50)

button1 = tk.Button(root, text="НаТми ΠΊΠ½ΠΎΠΏΠΊΡƒ")
button1.place(x=50, y=100)

root.mainloop()

grid() – упорядочиваСт Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Π² сСтку ΠΈΠ· рядов ΠΈ столбцов. Π‘Π°ΠΌΡ‹ΠΉ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΈ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ, позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ слоТныС интСрфСйсы, состоящиС ΠΈΠ· Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ². Π‘Π»ΠΎΠΆΠ½Π΅Π΅ Π² использовании, Ρ‡Π΅ΠΌ pack(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большС ΠΊΠΎΠ΄Π° для ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ².

import tkinter as tk

root = tk.Tk()
root.title("ΠŸΡ€ΠΈΠΌΠ΅Ρ€ grid()")
root.geometry("250x250")

frame = tk.Frame(root)
frame.pack(expand=True)

label1 = tk.Label(frame, text="Имя:")
label1.grid(row=0, column=0)

entry1 = tk.Entry(frame)
entry1.grid(row=0, column=1)

label2 = tk.Label(frame, text="Email:")
label2.grid(row=1, column=0)

entry2 = tk.Entry(frame)
entry2.grid(row=1, column=1)

button1 = tk.Button(frame, text="ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ")
button1.grid(row=2, column=1)

root.update_idletasks()
width = root.winfo_width()
height = root.winfo_height()
x = (root.winfo_screenwidth() // 2) - (width // 2)
y = (root.winfo_screenheight() // 2) - (height // 2)
root.geometry('{}x{}+{}+{}'.format(width, height, x, y))

root.mainloop()

Π’ Ρ†Π΅Π»ΠΎΠΌ, pack() Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для простых интСрфСйсов, place() – для Π±ΠΎΠ»Π΅Π΅ слоТных, Π° grid() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для создания слоТных интСрфСйсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½Π° Π°Π΄Π°ΠΏΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ, особоС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ растягиваниС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π½Π° нСсколько строк / столбцов.

🐍 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»

БвязываниС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² с функциями

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΎΡΡŒ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ дСйствиС, Π½ΡƒΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Π§Π°Ρ‰Π΅ всСго для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ command() ΠΈ bind(), Π½ΠΎ ΠΏΡ€ΠΈ нСобходимости ΠΊ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌ Tkinter ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… ΠΈ частично ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ.

ΠœΠ΅Ρ‚ΠΎΠ΄ command() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прямого связывания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ:

import tkinter as tk

root = tk.Tk()

def say_hello():
    print("ΠŸΡ€ΠΈΠ²Π΅Ρ‚!")

button1 = tk.Button(root, text="ΠŸΠΎΠ·Π΄ΠΎΡ€ΠΎΠ²Π°ΠΉΡΡ", command=say_hello)
button1.pack()

root.mainloop()

ΠœΠ΅Ρ‚ΠΎΠ΄ bind(), ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с command(), отличаСтся большСй Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ: Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для связывания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π»ΡŽΠ±Ρ‹ΠΌ событиСм, происходящим Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ – с Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΡ‹ΡˆΠΈ, Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ клавиши, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠΊΠ½Π° ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅:

import tkinter as tk

root = tk.Tk()

def say_hello(event=None):
    print("ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° bind()")

button1 = tk.Button(root, text="НаТми ΠΊΠ½ΠΎΠΏΠΊΡƒ")
button1.bind("<Button-1>", say_hello)
button1.pack()

root.mainloop()

НазначСниС ΠΊΠ½ΠΎΠΏΠΊΠ΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

import tkinter as tk

root = tk.Tk()

button1 = tk.Button(root, text="НаТми!", command=lambda: print("ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠΎΡ‚ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ!"))
button1.pack()

root.mainloop()

БвязываниС ΠΊΠ½ΠΎΠΏΠΊΠΈ с частично ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ:

import tkinter as tk
from functools import partial

root = tk.Tk()

def say_hello(name):
    print(f"ΠŸΡ€ΠΈΠ²Π΅Ρ‚, {name}!")

button1 = tk.Button(root, text="НаТми эту ΠΊΠ½ΠΎΠΏΠΊΡƒ", command=partial(say_hello, "ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ"))
button1.pack()

root.mainloop()

ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°

Π—Π°Π΄Π°Π½ΠΈΠ΅ 1

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Tkinter интСрфСйс для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ тСкст с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Entry ΠΈ Button, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ строку Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅.

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

РСшСниС:

import tkinter as tk

root = tk.Tk()

def button_click():
    input_text = entry.get()
    print(f"ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ тСкст: {input_text}")

entry = tk.Entry(root)
button = tk.Button(root, text="ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ", command=button_click)

entry.pack()
button.pack()

root.mainloop()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 2

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ интСрфСйс для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая измСняСт тСкст Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Label послС наТатия Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ.

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

РСшСниС:

import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="ИзмСни этот тСкст")
label.pack()
def change_text():
    label.config(text="Π­Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ тСкст")
button = tk.Button(root, text="НаТми ΠΊΠ½ΠΎΠΏΠΊΡƒ!", command=change_text)
button.pack()
root.mainloop()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 3

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ интСрфСйс для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ многострочный тСкст Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ Text ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°Ρ… Label количСство слов ΠΈ символов.

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.geometry("250x150")
root.title("ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ слов ΠΈ символов")

def count_words_characters():
    sentence = sentence_entry.get("1.0", "end-1c")  
    words = len(sentence.split())
    characters = len(sentence)
    words_label.config(text=f"ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ слов: {words}")
    characters_label.config(text=f"ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ символов: {characters}")

sentence_entry = tk.Text(root, height=3, wrap="word")  
words_label = ttk.Label(root)
characters_label = ttk.Label(root)
count_button = ttk.Button(root, text="ΠŸΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ", command=count_words_characters)

sentence_entry.pack()
words_label.pack()
characters_label.pack()
count_button.pack()

root.mainloop()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 4

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для ΠΎΡ†Π΅Π½ΠΊΠΈ сСрвиса ΠΏΠΎ шкалС ΠΎΡ‚ 0 Π΄ΠΎ 100. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Scale (ttk ΠΌΠΎΠ΄ΡƒΠ»ΡŒ).

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

РСшСниС:

import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text=f"Π’Π°ΡˆΠ° ΠΎΡ†Π΅Π½ΠΊΠ° ΠΎΡ‚ 0 Π΄ΠΎ 100")
label.pack()
def update_label(value):
    label.config(text=f"Π’Π°ΡˆΠ° ΠΎΡ†Π΅Π½ΠΊΠ°: {value}")
scale = tk.Scale(root, from_=0, to=100, orient="horizontal", command=update_label)
scale.pack()
root.mainloop()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 5

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ выполнСния Π·Π°Π΄Π°Ρ‡ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Progressbar ΠΈΠ· модуля ttk. Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π½ΡƒΠ»ΡΡ‚ΡŒΡΡ спустя 5 сСкунд.

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

РСшСниС:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

progressbar = ttk.Progressbar(root, orient="horizontal", length=200, mode="determinate")

progressbar.start()

def stop_progressbar():
    if root.winfo_exists() and progressbar.winfo_exists():
        progressbar.stop()
        progressbar["value"] = 0   
        root.quit()
        root.destroy()

if root.winfo_exists() and progressbar.winfo_exists():
    root.after(5000, stop_progressbar)

progressbar.pack()

def exit_app():
    stop_progressbar()

root.protocol("WM_DELETE_WINDOW", exit_app)

root.mainloop()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 6

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Tkinter интСрфСйс для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°ΠΊΠ°Π·Π° Ρ„Ρ€ΡƒΠΊΡ‚ΠΎΠ². Для Π²Ρ‹Π²ΠΎΠ΄Π° списка Ρ„Ρ€ΡƒΠΊΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Combobox ΠΈΠ· модуля ttk.

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

РСшСниС:

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.title("Π—Π°ΠΊΠ°Π·")

def select_item():
    selected_item = combobox.get()
    selection_label.config(text=f"Π’Ρ‹Π±Ρ€Π°Π½ΠΎ: {selected_item}, 1 ΠΊΠ³")

items = ["Π―Π±Π»ΠΎΠΊΠΈ", "ΠΠΏΠ΅Π»ΡŒΡΠΈΠ½Ρ‹", "Π’ΠΈΠ½ΠΎΠ³Ρ€Π°Π΄", "ΠŸΠ΅Ρ€ΡΠΈΠΊΠΈ", "ΠšΠ»ΡƒΠ±Π½ΠΈΠΊΠ°"]
combobox = ttk.Combobox(root, values=items)
selection_label = ttk.Label(root)
select_button = ttk.Button(root, text="Π—Π°ΠΊΠ°Π·Π°Ρ‚ΡŒ", command=select_item)

combobox.pack()
selection_label.pack()
select_button.pack()

root.mainloop()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 7

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ GUI ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ ΠΈΠ· ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹, ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ HEX-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

РСшСниС:

import tkinter as tk
import tkinter.colorchooser as cc

root = tk.Tk()
root.geometry("250x200")
root.title("Π’Ρ‹Π±ΠΎΡ€ Ρ†Π²Π΅Ρ‚Π°")

def choose_color():
    color = cc.askcolor()[1]  
    color_label.config(text=f"Π’Ρ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ Ρ†Π²Π΅Ρ‚ {color}")  
    second_label.config(bg=color)  

color_button = tk.Button(root, text="Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚", command=choose_color)
color_label = tk.Label(root, text="НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚")
second_label = tk.Label(root, text="\t\t\t\n\t\t\t")
color_button.pack(pady=10)
color_label.pack()
second_label.pack(pady=10)

root.mainloop()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 8

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Spinbox для получСния Π΄Π²ΡƒΡ… чисСл a ΠΈ b (0 <= a <= 100, 0 <= b <= 100), Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сумму всСх Ρ†Π΅Π»Ρ‹Ρ… чисСл Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ a Π΄ΠΎ b Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ.

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

РСшСниС:

import tkinter as tk
import tkinter.ttk as ttk

class SumApp:
    def __init__(self, root):
        self.root = root
        root.geometry("250x200")
        self.root.title("Π‘ΡƒΠΌΠΌΠ° чисСл")
        
        self.start_spinbox = ttk.Spinbox(root, from_=0, to=100, increment=1)
        self.end_spinbox = ttk.Spinbox(root, from_=0, to=100, increment=1)
        self.sum_label = tk.Label(root, text="")
        self.calc_button = tk.Button(root, text="Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ сумму", command=self.calculate_sum)
        self.start_spinbox.pack(pady=10)
        self.end_spinbox.pack(pady=10)
        self.sum_label.pack(pady=10)
        self.calc_button.pack(pady=10)
    
    def calculate_sum(self):
        start = int(self.start_spinbox.get())
        end = int(self.end_spinbox.get())
        sum_ = sum(range(start, end+1))
        self.sum_label.configure(text=f"Π‘ΡƒΠΌΠΌΠ° чисСл Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ {start} Π΄ΠΎ {end}: {sum_}")


root = tk.Tk()
app = SumApp(root)
root.mainloop()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 9

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ GUI интСрфСйс для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ², ΠΊΠ½ΠΈΠ³ ΠΈ ΠΌΡƒΠ»ΡŒΡ‚Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ². Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Notebook ΠΈ Treeview для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²ΠΊΠ»Π°Π΄ΠΊΠ°Ρ…. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΠΎΠΊΠ½ΠΎ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΈΠ·Π΄Π°Π½ΠΈΠΈ.

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

РСшСниС:

import tkinter as tk
from tkinter import ttk

def retrieve_details(event):
    item = event.widget.focus()
    values = event.widget.item(item)['values']
    details = f"Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎΠ± ΠΈΠ·Π΄Π°Π½ΠΈΠΈ:\n\n"
    for i in range(len(values)):
        details += f"{event.widget['columns'][i].capitalize()}: {values[i]}\n"
    popup = tk.Toplevel(root)
    popup.title(event.widget.item(item)['text'])
    popup.geometry("250x150")
    popup_label = ttk.Label(popup, text=details)
    popup_label.pack(pady=10)
    close_button = ttk.Button(popup, text="Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ", command=popup.destroy)
    close_button.pack()

root = tk.Tk()
root.title("ΠšΠ°Ρ‚Π°Π»ΠΎΠ³")
root.geometry("600x300")

notebook = ttk.Notebook(root)

movies_tab = ttk.Frame(notebook)
books_tab = ttk.Frame(notebook)
animation_tab = ttk.Frame(notebook)

notebook.add(movies_tab, text="Π€ΠΈΠ»ΡŒΠΌΡ‹")
notebook.add(books_tab, text="Книги")
notebook.add(animation_tab, text="ΠœΡƒΠ»ΡŒΡ‚Ρ„ΠΈΠ»ΡŒΠΌΡ‹")

movies_desc = ttk.Label(movies_tab, text="Бписок Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ²")
books_desc = ttk.Label(books_tab, text="Бписок книг")
animation_desc = ttk.Label(animation_tab, text="Бписок ΠΌΡƒΠ»ΡŒΡ‚Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ²")

movies_list = ttk.Treeview(movies_tab)
books_list = ttk.Treeview(books_tab)
animation_list = ttk.Treeview(animation_tab)

movies_list['columns'] = ('Π–Π°Π½Ρ€', 'РСТиссСр', 'Π“ΠΎΠ΄')
books_list['columns'] = ('Автор', 'Π˜Π·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ', 'Π“ΠΎΠ΄')
animation_list['columns'] = ('Π–Π°Π½Ρ€', 'Бтудия', 'Π Π΅ΠΉΡ‚ΠΈΠ½Π³')

for tree in [movies_list, books_list, animation_list]:
    for i, col in enumerate(tree['columns']):
        tree.column(col, width=100, anchor='center')
        tree.heading(col, text=col.capitalize())
    tree.bind("<Double-1>", retrieve_details)

movies_list.insert('', 'end', text='М3Π³Π°Π½', values=('Ѐантастика', 'Π”ΠΆΠ΅Ρ€Π°Ρ€Π΄ ДТонстоун', '2022'))
books_list.insert('', 'end', text='ΠŸΠ΅Ρ€Π΅ΠΊΡ€Π΅ΡΡ‚ΠΊΠΈ', values=('Π”ΠΆΠΎΠ½Π°Ρ‚Π°Π½ Π€Ρ€Π°Π½Π·Π΅Π½', 'Corpus', '2022'))
animation_list.insert('', 'end', text='Пиноккио Π“ΠΈΠ»ΡŒΠ΅Ρ€ΠΌΠΎ Π”Π΅Π»ΡŒ Π’ΠΎΡ€ΠΎ', values=('фэнтСзи', 'Disney+', '8.2'))

movies_desc.pack()
movies_list.pack()
books_desc.pack()
books_list.pack()
animation_desc.pack()
animation_list.pack()

notebook.pack(fill='both', expand=True)

root.mainloop()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 10

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ GUI ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ:

  • ВыполняСт основныС арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ – слоТСниС, Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅, Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ числами, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ корня, Π΄Π΅Π»Π΅Π½ΠΈΠ΅ с остатком ΠΈ цСлочислСнноС Π΄Π΅Π»Π΅Π½ΠΈΠ΅.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ очистку Π²Π²ΠΎΠ΄Π°.

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

РСшСниС:

import tkinter as tk
from tkinter import ttk
from math import sqrt

class Calculator:
    def __init__(self, master):
        self.master = master
        self.master.title("ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€")
        self.master.geometry("380x140")

        self.number_entry = ttk.Entry(self.master, width=20)
        self.number_entry.grid(row=0, column=0, columnspan=5, padx=5, pady=5)

        self.button_1 = ttk.Button(self.master, text="1", command=lambda: self.button_click(1))
        self.button_2 = ttk.Button(self.master, text="2", command=lambda: self.button_click(2))
        self.button_3 = ttk.Button(self.master, text="3", command=lambda: self.button_click(3))
        self.button_4 = ttk.Button(self.master, text="4", command=lambda: self.button_click(4))
        self.button_5 = ttk.Button(self.master, text="5", command=lambda: self.button_click(5))
        self.button_6 = ttk.Button(self.master, text="6", command=lambda: self.button_click(6))
        self.button_7 = ttk.Button(self.master, text="7", command=lambda: self.button_click(7))
        self.button_8 = ttk.Button(self.master, text="8", command=lambda: self.button_click(8))
        self.button_9 = ttk.Button(self.master, text="9", command=lambda: self.button_click(9))
        self.button_0 = ttk.Button(self.master, text="0", command=lambda: self.button_click(0))
        self.button_clear = ttk.Button(self.master, text="C", command=self.button_clear)
        self.button_add = ttk.Button(self.master, text="+", command=self.button_add)
        self.button_equal = ttk.Button(self.master, text="=", command=self.button_equal)
        self.button_subtract = ttk.Button(self.master, text="-", command=self.button_subtract)
        self.button_multiply = ttk.Button(self.master, text="*", command=self.button_multiply)
        self.button_divide = ttk.Button(self.master, text="/", command=self.button_divide)
        self.button_floor_div = ttk.Button(self.master, text="//", command=self.button_floor_div)
        self.button_modulus = ttk.Button(self.master, text="%", command=self.button_modulus)
        self.button_sqrt = ttk.Button(self.master, text="√", command=self.button_sqrt)
        self.button_neg = ttk.Button(self.master, text="+/-", command=self.button_neg)

        self.button_1.grid(row=1, column=0)
        self.button_2.grid(row=1, column=1)
        self.button_3.grid(row=1, column=2)
        self.button_add.grid(row=1, column=3)
        self.button_floor_div.grid(row=1, column=4)

        self.button_4.grid(row=2, column=0)
        self.button_5.grid(row=2, column=1)
        self.button_6.grid(row=2, column=2)
        self.button_subtract.grid(row=2, column=3)
        self.button_modulus.grid(row=2, column=4)

        self.button_7.grid(row=3, column=0)
        self.button_8.grid(row=3, column=1)
        self.button_9.grid(row=3, column=2)
        self.button_multiply.grid(row=3, column=3)
        self.button_sqrt.grid(row=3, column=4)

        self.button_clear.grid(row=4, column=0)
        self.button_0.grid(row=4, column=1)
        self.button_equal.grid(row=4, column=2)
        self.button_divide.grid(row=4, column=3)
        self.button_neg.grid(row=4, column=4)

        self.f_num = 0
        self.math = ""

    def button_click(self, number):
        current = self.number_entry.get()
        self.number_entry.delete(0, tk.END)
        self.number_entry.insert(0, str(current) + str(number))

    def button_clear(self):
        self.number_entry.delete(0, tk.END)

    def button_add(self):
        first_number = self.number_entry.get()
        self.math = "addition"
        self.f_num = int(first_number)
        self.number_entry.delete(0, tk.END)

    def button_equal(self):
        second_number = self.number_entry.get()
        self.number_entry.delete(0, tk.END)

        if self.math == "addition":
            self.number_entry.insert(0, self.f_num + int(second_number))

        if self.math == "multiplication":
            self.number_entry.insert(0, self.f_num * int(second_number))

        if self.math == "division":
            self.number_entry.insert(0, self.f_num / int(second_number))

        if self.math == "floor_div":
            self.number_entry.insert(0, self.f_num // int(second_number))

        if self.math == "modulus":
            self.number_entry.insert(0, self.f_num % int(second_number))

    def button_subtract(self):
        first_number = self.number_entry.get()
        self.math = "subtraction"
        self.f_num = int(first_number)
        self.number_entry.delete(0, tk.END)

    def button_multiply(self):
        first_number = self.number_entry.get()
        self.math = "multiplication"
        self.f_num = int(first_number)
        self.number_entry.delete(0, tk.END)

    def button_divide(self):
        first_number = self.number_entry.get()
        self.math = "division"
        self.f_num = int(first_number)
        self.number_entry.delete(0, tk.END)

    def button_floor_div(self):
        first_number = self.number_entry.get()
        self.math = "floor_div"
        self.f_num = int(first_number)
        self.number_entry.delete(0, tk.END)

    def button_modulus(self):
        first_number = self.number_entry.get()
        self.math = "modulus"
        self.f_num = int(first_number)
        self.number_entry.delete(0, tk.END)

    def button_sqrt(self):
        number = float(self.number_entry.get())
        result = sqrt(number)
        if result.is_integer():
            self.number_entry.delete(0, tk.END)
            self.number_entry.insert(0, int(result))
        else:
            self.number_entry.delete(0, tk.END)
            self.number_entry.insert(0, result)
    def button_neg(self):
        current = self.number_entry.get()
        if current.startswith("-"):
            current = current[1:]
        else:
            current = "-" + current
        self.number_entry.delete(0, tk.END)
        self.number_entry.insert(0, current)

if __name__ == '__main__':
    root = tk.Tk()
    calc = Calculator(root)
    root.mainloop()

ПодвСдСм ΠΈΡ‚ΠΎΠ³ΠΈ

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрСли основы создания GUI для Python-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ основныС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Tkinter. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ основы Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ³Ρ€ с Pygame.

***

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ самоучитСля

  1. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ, сфСры примСнСния, установка, ΠΎΠ½Π»Π°ΠΉΠ½ IDE
  2. ВсС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для изучСния Python с нуля – ΠΊΠ½ΠΈΠ³ΠΈ, сайты, ΠΊΠ°Π½Π°Π»Ρ‹ ΠΈ курсы
  3. Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…: ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
  4. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками
  5. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со списками ΠΈ списковыми Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ
  6. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со словарями ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ словарСй
  7. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°ΠΌΠΈ
  8. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со мноТСствами
  9. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ†ΠΈΠΊΠ»Π° for
  10. Условный Ρ†ΠΈΠΊΠ» while
  11. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ
  12. АнонимныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  13. РСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  14. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, замыкания ΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹
  15. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой
  16. РСгулярныС выраТСния
  17. ΠžΡΠ½ΠΎΠ²Ρ‹ скрапинга ΠΈ парсинга
  18. ΠžΡΠ½ΠΎΠ²Ρ‹ ООП: инкапсуляция ΠΈ наслСдованиС
  19. ΠžΡΠ½ΠΎΠ²Ρ‹ ООП: абстракция ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ
  20. ГрафичСский интСрфСйс Π½Π° Tkinter
  21. ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ³Ρ€ Π½Π° Pygame
  22. ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с SQLite
  23. ΠžΡΠ½ΠΎΠ²Ρ‹ Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Flask
  24. ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с NumPy
  25. ΠžΡΠ½ΠΎΠ²Ρ‹ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… с Pandas

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
28 июня 2018

3 самых Π²Π°ΠΆΠ½Ρ‹Ρ… сфСры примСнСния Python: возмоТности языка

БущСствуСт мноТСство областСй примСнСния Python, Π½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ особСнно...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒΒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...