Python - GUI Programming

Python cung cấp nhiều tùy chọn để phát triển giao diện người dùng đồ họa (GUIs). Các tính năng quan trọng nhất được liệt kê dưới đây.

  • Tkinter − Tkinter là giao diện Python đến bộ công cụ Tk GUI được cung cấp cùng với Python. Chúng ta sẽ xem xét tùy chọn này trong chương này.

  • wxPython − Đây là một giao diện Python mã nguồn mở cho bộ công cụ GUI wxWidgets. Bạn có thể tìm thấy một hướng dẫn đầy đủ về WxPython here .

  • PyQt − Đây cũng là một giao diện Python cho một thư viện GUI Qt đa nền tảng nổi tiếng. TutorialsPoint có một hướng dẫn rất tốt về PyQt5 here .

  • PyGTK − PyGTK là một tập hợp các lớp bọc được viết bằng Python và C cho thư viện GUI GTK +. Hướng dẫn đầy đủ về PyGTK có sẵn here .

  • PySimpleGUI − PySimpleGui là một thư viện GUI mã nguồn mở, đa nền tảng cho Python. Nó nhằm mục đích cung cấp một API đồng nhất để tạo các GUI trên máy tính dựa trên các công cụ Tkinter, PySide và WxPython của Python. Để xem hướng dẫn chi tiết về PySimpleGUI, hãy nhấp vào here .

  • Pygame − Pygame là một thư viện Python phổ biến được sử dụng để phát triển trò chơi điện tử. Nó miễn phí, mã nguồn mở và là một lớp bao quanh đa nền tảng cho Simple DirectMedia Library (SDL). Để có một hướng dẫn toàn diện về Pygame, visit liên kết này.

  • Jython − Jython là một phiên bản Python dành cho Java, cho phép các script Python truy cập liền mạch vào các thư viện lớp Java trên máy cục bộ http: //www.jython.org .

Có nhiều giao diện khác có sẵn, bạn có thể tìm thấy chúng trên mạng.

Tkinter Programming

Tkinter là thư viện GUI tiêu chuẩn cho Python. Khi kết hợp Python với Tkinter, nó cung cấp một cách nhanh chóng và dễ dàng để tạo ra các ứng dụng GUI. Tkinter cung cấp một giao diện lập trình hướng đối tượng mạnh mẽ cho bộ công cụ Tk GUI.

Gói tkinter bao gồm các mô-đun sau −

  • Tkinter − Mô-đun Tkinter chính.

  • tkinter.colorchooser − Hộp thoại cho phép người dùng chọn màu.

  • tkinter.commondialog − Lớp cơ sở cho các hộp thoại được định nghĩa trong các mô-đun khác được liệt kê ở đây.

  • tkinter.filedialog − Các hộp thoại thông dụng cho phép người dùng chỉ định một tệp để mở hoặc lưu.

  • tkinter.font − Tiện ích để hỗ trợ làm việc với phông chữ.

  • tkinter.messagebox − Truy cập vào các hộp thoại chuẩn của Tk.

  • tkinter.scrolledtext − Widget văn bản với thanh cuộn dọc được tích hợp sẵn.

  • tkinter.simpledialog − Các hộp thoại cơ bản và các hàm tiện ích.

  • tkinter.ttk − Bộ widget theo chủ đề được giới thiệu trong Tk 8.5, cung cấp các lựa chọn hiện đại cho nhiều widget cổ điển trong mô-đun tkinter chính.

Tạo một ứng dụng GUI bằng cách sử dụng Tkinter là một nhiệm vụ dễ dàng. Tất cả những gì bạn cần làm là thực hiện các bước sau.

  • Nhập mô-đun Tkinter.

  • Tạo cửa sổ chính của ứng dụng GUI.

  • Thêm một hoặc nhiều widget đã đề cập ở trên vào ứng dụng GUI.

  • Nhập vòng lặp sự kiện chính để thực hiện hành động đối với mỗi sự kiện được kích hoạt bởi người dùng.

Example

# note that module name has changed from Tkinter in Python 2
# to tkinter in Python 3

import tkinter
top = tkinter.Tk()

# Code to add widgets will go here...
top.mainloop()

Điều này sẽ tạo ra một cửa sổ sau đây −

Tkinter Programming

Khi chương trình trở nên phức tạp hơn, việc sử dụng phương pháp lập trình hướng đối tượng giúp mã nguồn trở nên có tổ chức hơn.

import tkinter as tk
class App(tk.Tk):
   def __init__(self):
      super().__init__()

app = App()
app.mainloop()

Tkinter Widgets

Tkinter cung cấp nhiều điều khiển, chẳng hạn như nút bấm, nhãn và ô nhập văn bản được sử dụng trong ứng dụng GUI. Những điều khiển này thường được gọi là widget.

Hiện tại có 15 loại widget trong Tkinter. Chúng tôi sẽ trình bày các widget này cùng với mô tả ngắn gọn trong bảng sau −

Sr.No. Operator & Description
1 Button The Button widget is used to display the buttons in your application.
2 Canvas The Canvas widget is used to draw shapes, such as lines, ovals, polygons and rectangles, in your application.
3 Checkbutton The Checkbutton widget is used to display a number of options as checkboxes. The user can select multiple options at a time.
4 Entry The Entry widget is used to display a single-line text field for accepting values from a user.
5 Frame The Frame widget is used as a container widget to organize other widgets.
6 Label The Label widget is used to provide a single-line caption for other widgets. It can also contain images.
7 Listbox The Listbox widget is used to provide a list of options to a user.
8 Menubutton The Menubutton widget is used to display menus in your application.
9 Menu The Menu widget is used to provide various commands to a user. These commands are contained inside Menubutton.
10 Message The Message widget is used to display multiline text fields for accepting values from a user.
11 Radiobutton The Radiobutton widget is used to display a number of options as radio buttons. The user can select only one option at a time.
12 Scale The Scale widget is used to provide a slider widget.
13 Scrollbar The Scrollbar widget is used to add scrolling capability to various widgets, such as list boxes.
14 Text The Text widget is used to display text in multiple lines.
15 Toplevel The Toplevel widget is used to provide a separate window container.
16 Spinbox The Spinbox widget is a variant of the standard Tkinter Entry widget, which can be used to select from a fixed number of values.
17 PanedWindow A PanedWindow is a container widget that may contain any number of panes, arranged horizontally or vertically.
18 LabelFrame A labelframe is a simple container widget. Its primary purpose is to act as a spacer or container for complex window layouts.
19 tkMessageBox This module is used to display message boxes in your applications.

Hãy cùng nghiên cứu chi tiết về các widget này.

Standard Attributes

Hãy xem cách một số thuộc tính phổ biến, chẳng hạn như kích thước, màu sắc và phông chữ được xác định như thế nào.

  • Dimensions

  • Colors

  • Fonts

  • Anchors

  • Relief styles

  • Bitmaps

  • Cursors

Hãy cùng chúng ta nghiên cứu chúng một cách ngắn gọn −

Geometry Management

Tất cả các widget Tkinter đều có quyền truy cập vào các phương thức quản lý hình dạng cụ thể, nhằm mục đích tổ chức các widget trong khu vực widget cha. Tkinter cung cấp các lớp quản lý hình dạng sau: pack, grid và place.

  • The pack() Method − Trình quản lý hình học này tổ chức các widget thành các khối trước khi đặt chúng vào widget cha.

  • The grid() Method − Trình quản lý hình học này tổ chức các widget trong một cấu trúc giống như bảng trong widget cha.

  • The place() Method − Trình quản lý hình học này tổ chức các widget bằng cách đặt chúng ở một vị trí cụ thể trong widget cha.

Hãy cùng tìm hiểu ngắn gọn về các phương pháp quản lý hình học −

SimpleDialog

Mô-đun simpledialog trong gói tkinter bao gồm một lớp hộp thoại và các hàm tiện lợi để chấp nhận đầu vào của người dùng thông qua một hộp thoại modal. Nó bao gồm một nhãn, một widget nhập liệu và hai nút Ok và Cancel. Các hàm này là −

  • askfloat(title, prompt, **kw) − Chấp nhận một số thực.

  • askinteger(title, prompt, **kw) − Chấp nhận một đầu vào kiểu số nguyên.

  • askstring(title, prompt, **kw) − Chấp nhận một đầu vào văn bản từ người dùng.

Ba hàm trên cung cấp các hộp thoại yêu cầu người dùng nhập một giá trị của loại mong muốn. Nếu nhấn Ok, giá trị nhập vào sẽ được trả về; nếu nhấn Cancel, None sẽ được trả về.

askinteger

from tkinter.simpledialog import askinteger
from tkinter import *
from tkinter import messagebox
top = Tk()

top.geometry("100x100")
def show():
   num = askinteger("Input", "Input an Integer")
   print(num)
   
B = Button(top, text ="Click", command = show)
B.place(x=50,y=50)

top.mainloop()

Nó sẽ tạo ra output

SimpleDialog

askfloat

from tkinter.simpledialog import askfloat
from tkinter import *
top = Tk()

top.geometry("100x100")
def show():
   num = askfloat("Input", "Input a floating point number")
   print(num)
   
B = Button(top, text ="Click", command = show)
B.place(x=50,y=50)

top.mainloop()

Nó sẽ tạo ra output

askfloat

askstring

from tkinter.simpledialog import askstring
from tkinter import *

top = Tk()

top.geometry("100x100")
def show():
   name = askstring("Input", "Enter you name")
   print(name)
   
B = Button(top, text ="Click", command = show)
B.place(x=50,y=50)

top.mainloop()

Nó sẽ tạo ra output

askstring

The FileDialog Module

Mô-đun filedialog trong gói Tkinter bao gồm một lớp FileDialog. Nó cũng định nghĩa các hàm tiện lợi cho phép người dùng thực hiện các hoạt động mở tệp, lưu tệp và mở thư mục.

  • filedialog.asksaveasfilename()
  • filedialog.asksaveasfile()
  • filedialog.askopenfilename()
  • filedialog.askopenfile()
  • filedialog.askdirectory()
  • filedialog.askopenfilenames()
  • filedialog.askopenfiles()

askopenfile

Hàm này cho phép người dùng chọn một tệp mong muốn từ hệ thống tệp. Cửa sổ hộp thoại tệp có các nút Mở và Hủy. Tên tệp cùng với đường dẫn của nó được trả về khi nút Ok được nhấn, và None nếu nút Hủy được nhấn.

from tkinter.filedialog import askopenfile
from tkinter import *

top = Tk()

top.geometry("100x100")
def show():
   filename = askopenfile()
   print(filename)
   
B = Button(top, text ="Click", command = show)
B.place(x=50,y=50)

top.mainloop()

Nó sẽ tạo ra output

askopenfile

ColorChooser

Mô-đun colorchooser được bao gồm trong gói tkinter có tính năng cho phép người dùng chọn một đối tượng màu mong muốn thông qua hộp thoại màu. Hàm askcolor() hiển thị hộp thoại màu với các mẫu màu được định nghĩa trước và khả năng chọn màu tùy chỉnh bằng cách thiết lập các giá trị RGB. Hộp thoại trả về một bộ giá trị RGB của màu đã chọn cũng như giá trị hex của nó.

from tkinter.colorchooser import askcolor
from tkinter import *

top = Tk()

top.geometry("100x100")
def show():
   color = askcolor()
   print(color)
   
B = Button(top, text ="Click", command = show)
B.place(x=50,y=50)

top.mainloop()

Nó sẽ tạo ra output

ColorChooser
((0, 255, 0), '#00ff00')

ttk module

Thuật ngữ ttk xuất phát từ các widget theo chủ đề của Tk. Mô-đun ttk được giới thiệu từ Tk 8.5 trở đi. Nó cung cấp thêm nhiều lợi ích bao gồm việc hiển thị phông chữ chống răng cưa dưới X11 và độ trong suốt của cửa sổ. Nó cung cấp hỗ trợ về chủ đề và kiểu dáng cho Tkinter.

Mô-đun ttk đi kèm với 18 widget, trong đó có 12 widget đã có sẵn trong Tkinter. Việc nhập ttk sẽ ghi đè các widget này bằng những widget mới được thiết kế để có kiểu dáng tốt hơn và hiện đại hơn trên tất cả các nền tảng.

6 widget mới trong ttk là: Combobox, Separator, Sizegrip, Treeview, Notebook và ProgressBar.

Để ghi đè các widget cơ bản của Tk, việc nhập khẩu nên theo sau việc nhập khẩu Tk.

from tkinter import *
from tkinter.ttk import *

Các widget Tk gốc được tự động thay thế bằng các widget tkinter.ttk. Chúng bao gồm: Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton, PanedWindow, Radiobutton, Scale và Scrollbar.

Các widget mới mang lại giao diện và cảm giác tốt hơn trên các nền tảng; tuy nhiên, các widget thay thế không hoàn toàn tương thích. Sự khác biệt chính là các tùy chọn widget như "fg", "bg" và các tùy chọn khác liên quan đến kiểu dáng widget không còn có mặt trong các widget Ttk. Thay vào đó, hãy sử dụng lớp ttk.Style để có hiệu ứng kiểu dáng cải tiến.

Các widget mới trong mô-đun ttk là −

  • Notebook − Tiện ích này quản lý một bộ sưu tập các "tab" mà bạn có thể chuyển đổi giữa chúng, thay đổi cửa sổ đang hiển thị hiện tại.

  • ProgressBar − Widget này được sử dụng để hiển thị tiến trình hoặc quá trình tải thông qua việc sử dụng các hoạt ảnh.

  • Separator − Được sử dụng để phân tách các widget khác nhau bằng một dòng phân cách.

  • Treeview − Widget này được sử dụng để nhóm các mục lại với nhau trong một cấu trúc phân cấp giống như cây. Mỗi mục có một nhãn văn bản, một hình ảnh tùy chọn và một danh sách các giá trị dữ liệu tùy chọn.

  • ComboBox − Được sử dụng để tạo một danh sách thả xuống các tùy chọn mà người dùng có thể chọn một.

  • Sizegrip − Tạo một tay cầm nhỏ gần góc dưới bên phải của màn hình, có thể được sử dụng để thay đổi kích thước cửa sổ.

Combobox Widget

Combobox ttk trong Python hiển thị một danh sách tùy chọn dạng thả xuống và hiển thị chúng một lần. Nó là một lớp con của widget Entry. Do đó, nó kế thừa nhiều tùy chọn và phương thức từ lớp Entry.

Syntax

from tkinter import ttk

Combo = ttk.Combobox(master, values.......)

Hàm get() để lấy giá trị hiện tại của Combobox.

Example

from tkinter import *
from tkinter import ttk

top = Tk()
top.geometry("200x150")

frame = Frame(top)
frame.pack()

langs = ["C", "C++", "Java",
   "Python", "PHP"]
   
Combo = ttk.Combobox(frame, values = langs)
Combo.set("Pick an Option")
Combo.pack(padx = 5, pady = 5)
top.mainloop()

Nó sẽ tạo ra output

Combobox Widget

Progressbar

Widget ttk ProgressBar, và cách nó có thể được sử dụng để tạo màn hình tải hoặc hiển thị tiến trình của một tác vụ hiện tại.

Syntax

ttk.Progressbar(parent, orient, length, mode)

Parameters

  • Parent − Container mà thanh ProgressBar sẽ được đặt vào, chẳng hạn như root hoặc một khung Tkinter.

  • Orient − Xác định hướng của ProgressBar, có thể là dọc hoặc ngang.

  • Length − Xác định chiều rộng của ProgressBar bằng cách nhận một giá trị số nguyên.

  • Mode − Có hai tùy chọn cho tham số này, xác định và không xác định.

Example

Mã dưới đây tạo ra một thanh tiến trình với ba nút, mỗi nút được liên kết với một hàm khác nhau.

Hàm đầu tiên tăng "value" hoặc "progress" trong thanh tiến trình (progressbar) lên 20. Điều này được thực hiện bằng hàm step(), hàm này nhận một giá trị nguyên để thay đổi số lượng tiến trình. (Mặc định là 1.0)

Hàm thứ hai giảm "value" hoặc "progress" trong thanh tiến trình (progressbar) xuống 20.

Hàm thứ ba in ra mức độ tiến triển hiện tại trong thanh tiến độ.

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
frame= ttk.Frame(root)
def increment():
   progressBar.step(20)
   
def decrement():
   progressBar.step(-20)
   
def display():
   print(progressBar["value"])

progressBar= ttk.Progressbar(frame, mode='determinate')
progressBar.pack(padx = 10, pady = 10)

button= ttk.Button(frame, text= "Increase", command= increment)
button.pack(padx = 10, pady = 10, side = tk.LEFT)

button= ttk.Button(frame, text= "Decrease", command= decrement)
button.pack(padx = 10, pady = 10, side = tk.LEFT)
button= ttk.Button(frame, text= "Display", command= display)
button.pack(padx = 10, pady = 10, side = tk.LEFT)

frame.pack(padx = 5, pady = 5)
root.mainloop()

Nó sẽ tạo ra output

Progressbar

Notebook

Mô-đun ttk của Tkinter có một widget hữu ích mới gọi là Notebook. Đây là một tập hợp các container (ví dụ: khung) có nhiều widget là con bên trong.

Mỗi "tab" hoặc "cửa sổ" đều có một ID tab gắn liền với nó, được sử dụng để xác định tab nào sẽ được chuyển đổi.

Bạn có thể hoán đổi giữa các container này giống như bạn làm trên một trình soạn thảo văn bản thông thường.

Syntax

notebook = ttk.Notebook(master, *options)

Example

Trong ví dụ này, thêm 3 cửa sổ vào widget Notebook của chúng ta theo hai cách khác nhau. Phương pháp đầu tiên liên quan đến hàm add(), hàm này đơn giản chỉ thêm một tab mới vào cuối. Phương pháp khác là hàm insert(), hàm này có thể được sử dụng để thêm một tab vào một vị trí cụ thể.

Hàm add() nhận một tham số bắt buộc là widget chứa cần được thêm vào, và các tham số còn lại là tùy chọn như văn bản (văn bản hiển thị làm tiêu đề tab), hình ảnh và compound.

Hàm insert() yêu cầu một tab_id, xác định vị trí nơi nó nên được chèn. tab_id có thể là một giá trị chỉ mục hoặc có thể là một chuỗi ký tự như "end", điều này sẽ thêm nó vào cuối.

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
nb = ttk.Notebook(root)

# Frame 1 and 2
frame1 = ttk.Frame(nb)
frame2 = ttk.Frame(nb)

label1 = ttk.Label(frame1, text = "This is Window One")
label1.pack(pady = 50, padx = 20)
label2 = ttk.Label(frame2, text = "This is Window Two")
label2.pack(pady = 50, padx = 20)

frame1.pack(fill= tk.BOTH, expand=True)
frame2.pack(fill= tk.BOTH, expand=True)
nb.add(frame1, text = "Window 1")
nb.add(frame2, text = "Window 2")

frame3 = ttk.Frame(nb)
label3 = ttk.Label(frame3, text = "This is Window Three")
label3.pack(pady = 50, padx = 20)
frame3.pack(fill= tk.BOTH, expand=True)
nb.insert("end", frame3, text = "Window 3")
nb.pack(padx = 5, pady = 5, expand = True)

root.mainloop()

Nó sẽ tạo ra output

Notebook

Treeview

Widget Treeview được sử dụng để hiển thị các mục theo cách bảng hoặc theo dạng phân cấp. Nó hỗ trợ các tính năng như tạo hàng và cột cho các mục, cũng như cho phép các mục có thể có các mục con, dẫn đến định dạng phân cấp.

Syntax

tree = ttk.Treeview(container, **options)

Options

Sr.No. Option & Description
1 columns A list of column names
2 displaycolumns A list of column identifiers (either symbolic or integer indices) specifying which data columns are displayed and the order in which they appear, or the string "#all".
3 height The number of rows visible.
4 padding Specifies the internal padding for the widget. Can be either an integer or a list of 4 values.
5 selectmode One of "extended", "browse" or "none". If set to "extended" (default), multiple items can be selected. If "browse", only a single item can be selected at a time. If "none", the selection cannot be changed by the user.
6 show A list containing zero or more of the following values, specifying which elements of the tree to display. The default is "tree headings", i.e., show all elements.

Example

Trong ví dụ này, chúng ta sẽ tạo một Widget Treeview ttk đơn giản và điền một số dữ liệu vào đó. Chúng ta đã có một số dữ liệu được lưu trữ trong một danh sách, mà chúng ta sẽ đọc và thêm vào widget Treeview trong hàm read_data() của chúng ta.

Chúng ta trước tiên cần định nghĩa một danh sách/tuple các tên cột. Chúng ta đã bỏ qua cột "Name" vì đã có một cột (mặc định) với tên trống.

Chúng ta sau đó gán danh sách/tuple đó cho tùy chọn cột trong Treeview, tiếp theo là định nghĩa "headings", trong đó cột là cột thực tế, trong khi tiêu đề chỉ là tên của cột xuất hiện khi widget được hiển thị. Chúng ta đặt tên cho mỗi cột. "#0" là tên của cột mặc định.

Hàm tree.insert() có các tham số sau -

  • Parent − để lại dưới dạng chuỗi trống nếu không có.

  • Position − nơi chúng ta muốn thêm mục mới. Để thêm vào, sử dụng tk.END.

  • Iid − đây là ID mục được sử dụng để theo dõi mục đó sau này.

  • Text − mà chúng ta sẽ gán giá trị đầu tiên trong danh sách (tên).

Giá trị mà chúng ta sẽ truyền vào là 2 giá trị khác mà chúng ta đã lấy từ danh sách.

The Complete Code

import tkinter as tk
import tkinter.ttk as ttk
from tkinter import simpledialog

root = tk.Tk()
data = [
   ["Bobby",26,20000],
   ["Harrish",31,23000],
   ["Jaya",18,19000],
   ["Mark",22, 20500],
]
index=0
def read_data():
   for index, line in enumerate(data):
      tree.insert('', tk.END, iid = index,
         text = line[0], values = line[1:])
columns = ("age", "salary")

tree= ttk.Treeview(root, columns=columns ,height = 20)
tree.pack(padx = 5, pady = 5)

tree.heading('#0', text='Name')
tree.heading('age', text='Age')
tree.heading('salary', text='Salary')

read_data()
root.mainloop()

Nó sẽ tạo ra output

Treeview

Sizegrip

Widget Sizegrip cơ bản là một tay cầm nhỏ giống như mũi tên, thường được đặt ở góc dưới bên phải của màn hình. Kéo Sizegrip trên màn hình cũng sẽ thay đổi kích thước của container mà nó được gắn vào.

Syntax

sizegrip = ttk.Sizegrip(parent, **options)

Example

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.geometry("100x100")

frame = ttk.Frame(root)
label = ttk.Label(root, text = "Hello World")
label.pack(padx = 5, pady = 5)
sizegrip = ttk.Sizegrip(frame)
sizegrip.pack(expand = True, fill = tk.BOTH, anchor = tk.SE)
frame.pack(padx = 10, pady = 10, expand = True, fill = tk.BOTH)

root.mainloop()

Nó sẽ tạo ra output

Sizegrip

Separator

Widget ttk Separator là một widget rất đơn giản, chỉ có một mục đích là giúp "tách" các widget thành các nhóm/phân vùng bằng cách vẽ một đường giữa chúng. Chúng ta có thể thay đổi hướng của đường này (separator) thành ngang hoặc dọc, và thay đổi chiều dài/chiều cao của nó.

Syntax

separator = ttk.Separator(parent, **options)

"orient", có thể là tk.VERTICAL hoặc tk.HORIZONTAL, cho một bộ phân cách theo chiều dọc và chiều ngang tương ứng.

Example

Ở đây, chúng tôi đã tạo ra hai widget Label, và sau đó tạo một Bộ phân cách Ngang giữa chúng.

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.geometry("200x150")

frame = ttk.Frame(root)

label = ttk.Label(frame, text = "Hello World")
label.pack(padx = 5)

separator = ttk.Separator(frame,orient= tk.HORIZONTAL)
separator.pack(expand = True, fill = tk.X)

label = ttk.Label(frame, text = "Welcome To TutorialsPoint")
label.pack(padx = 5)

frame.pack(padx = 10, pady = 50, expand = True, fill = tk.BOTH)

root.mainloop()

Nó sẽ tạo ra output

Separator