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

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

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

ГрафичСский интСрфСйс для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° 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()
***

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ! Π’Ρ‹ освоили всС основы для создания ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… GUI-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Tkinter.

Π’Ρ‹ ΡƒΠΌΠ΅Π΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠΊΠ½Π°, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π½Π° Π½ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pack, place ΠΈ grid, ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ, связывая с функциями. Π£ вас Π΅ΡΡ‚ΡŒ всС Π±Π°Π·ΠΎΠ²Ρ‹Π΅ инструмСнты.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΡ€Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΊ созданию ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹Ρ…, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’ ΠΏΠΎΠ»Π½ΠΎΠΉ вСрсии ΡƒΡ€ΠΎΠΊΠ° вас ΠΆΠ΄ΡƒΡ‚ 10 практичСских ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹:

  • ΠŸΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅ΡΡŒ с дСсятком Π½ΠΎΠ²Ρ‹Ρ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ²: ΠΎΡ‚ Progressbar ΠΈ Combobox Π΄ΠΎ Treeview.
  • ΠΠ°ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ слоТных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ классов.
  • Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΡ‚Π΅ 10 Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… GUI-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ основу для собствСнных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

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

admin
11 дСкабря 2018

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

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

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

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

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

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