Hướng dẫn dùng pysimplegui examples python

Khi bạn đang tạo giao diện người dùng đồ họa (GUI), bạn sẽ thường thấy rằng bạn cần tạo nhiều hơn một cửa sổ. Trong hướng dẫn này, bạn sẽ học cách tạo hai cửa sổ với PySimpleGUI .

PySimpleGUI là một trong những GUI Python dễ bắt đầu nhất. Nó bao bọc các GUI Python khác và cung cấp cho chúng một giao diện chung. Bạn có thể đọc thêm về nó trong Giới thiệu về PySimpleGUI của tôi hoặc trong bài viết của tôi về Real Python, PySimpleGUI: Cách đơn giản để tạo GUI với Python .

Bắt đầu

Bạn sẽ muốn cài đặt PySimpleGUI để bắt đầu sử dụng nó. Bạn có thể sử dụng pip cho điều đó:

python -m pip install pysimplegui

Tạo phương thức cửa sổ

PySimpleGUI cung cấp Phần tử cửa sổ  mà bạn sử dụng để hiển thị các Phần tử khác trong đó, chẳng hạn như nút, văn bản, hình ảnh và hơn thế nữa. Các Windows này có thể được làm Modal. Cửa sổ Phương thức sẽ không cho phép bạn tương tác với bất kỳ Windows nào khác trong chương trình của bạn cho đến khi bạn thoát khỏi nó. Điều này rất hữu ích khi bạn muốn buộc người dùng đọc nội dung nào đó hoặc đặt câu hỏi cho người dùng. Ví dụ: một hộp thoại phương thức có thể được sử dụng để hỏi người dùng nếu họ thực sự muốn Thoát khỏi chương trình của bạn hoặc để hiển thị hộp thoại thỏa thuận người dùng cuối (EULA).

Bạn có thể tạo hai Windows và hiển thị chúng cùng lúc trong PySimpleGUI như sau:

import PySimpleGUI as sg

def open_window():
    layout = [[sg.Text("New Window", key="new")]]
    window = sg.Window("Second Window", layout, modal=True)
    choice = None
    while True:
        event, values = window.read()
        if event == "Exit" or event == sg.WIN_CLOSED:
            break
        
    window.close()


def main():
    layout = [[sg.Button("Open Window", key="open")]]
    window = sg.Window("Main Window", layout)
    while True:
        event, values = window.read()
        if event == "Exit" or event == sg.WIN_CLOSED:
            break
        if event == "open":
            open_window()
        
    window.close()


if __name__ == "__main__":
    main()

Khi bạn chạy mã này, bạn sẽ thấy một Cửa sổ Chính nhỏ trông giống như sau:

Hướng dẫn dùng pysimplegui examples python

Nếu bạn nhấp vào nút “Mở Cửa sổ”, bạn sẽ nhận được một Cửa sổ mới trông giống như sau:

Hướng dẫn dùng pysimplegui examples python

Cửa sổ thứ hai này có một tham số có tên là modal trong đó được đặt thành True . Điều đó có nghĩa là bạn không thể tương tác với Cửa sổ đầu tiên cho đến khi bạn đóng cửa sổ thứ hai.

Bây giờ chúng ta hãy xem xét một cách mà bạn có thể rút ngắn mã của mình nếu bạn đang tạo một Cửa sổ đơn giản như ở trên.

Tạo cửa sổ mới trong dòng

Bạn không phải viết một hàm hoàn toàn riêng biệt cho Cửa sổ phụ của mình. Nếu bạn không có nhiều tiện ích con trong Cửa sổ thứ hai, thì bạn có thể tạo Cửa sổ dưới dạng một hoặc hai lớp lót.

Đây là một cách để làm điều đó:

import PySimpleGUI as sg


def main():
    layout = [[sg.Button("Open Window", key="open")]]
    window = sg.Window("Main Window", layout)
    while True:
        event, values = window.read()
        if event == "Exit" or event == sg.WIN_CLOSED:
            break
        if event == "open":
            if sg.Window("Other Window", [[sg.Text("Try Again?")], 
                                          [sg.Yes(), sg.No()]]).read(close=True)[0] == "Yes":
                print("User chose yes!")
            else:
                print("User chose no!")
        
    window.close()


if __name__ == "__main__":
    main()

Trong ví dụ này, khi bạn nhấp vào nút “Mở Cửa sổ”, nó sẽ tạo Cửa sổ phụ trong một câu lệnh có điều kiện. Cửa sổ này gọi trực tiếp read () và đóng khi người dùng chọn “Có”, “Không” hoặc thoát khỏi Cửa sổ. Tùy thuộc vào những gì người dùng chọn, điều kiện sẽ in ra một cái gì đó khác nhau.

Mẫu thiết kế nhiều cửa sổ truyền thống

PySimpleGUI có một phương pháp được khuyến nghị để làm việc với nhiều cửa sổ. Nó được đề cập trong Cookbook của họ và trong các bản trình diễn của họ trên Github . Đây là một ví dụ từ Demo_Design_Pattern_Multiple_Windows.py:

import PySimpleGUI as sg
"""
    Demo - 2 simultaneous windows using read_all_window

    Window 1 launches window 2
    BOTH remain active in parallel

    Both windows have buttons to launch popups.  The popups are "modal" and thus no other windows will be active

    Copyright 2020 PySimpleGUI.org
"""

def make_win1():
    layout = [[sg.Text('This is the FIRST WINDOW'), sg.Text('      ', k='-OUTPUT-')],
              [sg.Text('Click Popup anytime to see a modal popup')],
              [sg.Button('Launch 2nd Window'), sg.Button('Popup'), sg.Button('Exit')]]
    return sg.Window('Window Title', layout, location=(800,600), finalize=True)


def make_win2():
    layout = [[sg.Text('The second window')],
              [sg.Input(key='-IN-', enable_events=True)],
              [sg.Text(size=(25,1), k='-OUTPUT-')],
              [sg.Button('Erase'), sg.Button('Popup'), sg.Button('Exit')]]
    return sg.Window('Second Window', layout, finalize=True)

window1, window2 = make_win1(), None        # start off with 1 window open

while True:             # Event Loop
    window, event, values = sg.read_all_windows()
    if event == sg.WIN_CLOSED or event == 'Exit':
        window.close()
        if window == window2:       # if closing win 2, mark as closed
            window2 = None
        elif window == window1:     # if closing win 1, exit program
            break
    elif event == 'Popup':
        sg.popup('This is a BLOCKING popup','all windows remain inactive while popup active')
    elif event == 'Launch 2nd Window' and not window2:
        window2 = make_win2()
    elif event == '-IN-':
        window['-OUTPUT-'].update(f'You enetered {values["-IN-"]}')
    elif event == 'Erase':
        window['-OUTPUT-'].update('')
        window['-IN-'].update('')
window.close()

Khi bạn chạy mã này, bạn có thể mở một số cửa sổ khác nhau trông giống như sau:

Hướng dẫn dùng pysimplegui examples python

Bạn sẽ muốn thử sử dụng cả hai phương pháp này để xem cách nào phù hợp nhất với bạn. Điều thú vị về phương pháp này là bạn chỉ có một vòng lặp sự kiện, giúp đơn giản hóa mọi thứ.

Kết thúc

PySimpleGUI cho phép bạn tạo giao diện người dùng đơn giản cũng như phức tạp. Mặc dù nó không được đề cập ở đây, bạn cũng có thể sử dụng sg.popup () để hiển thị hộp thoại đơn giản hơn cho người dùng. Các hộp thoại này cũng có thể là phương thức nhưng không hoàn toàn có thể tùy chỉnh được như Window thông thường.

Hãy dùng thử PySimpleGUI và xem bạn nghĩ gì.

19 hữu ích 0 bình luận 11k xem chia sẻ