Как заставить мои кнопки реагировать на нажатия - PullRequest
0 голосов
/ 28 августа 2018

Я хочу создать Python GUI для настольного приложения. Я разработал это с Tkinter:

Две кнопки используются для выполнения команд и выхода из приложения, Button one - переход к коду и Button two - для выхода. Но графический интерфейс не отвечает.

при выполнении процесса. Нажатие button two не закрывает приложение, а нажатие button 1 не вызывает код в функции def clicked().

Есть ли лучший способ выхода даже во время работы программы (например, прерывания?)

В Tkinter мы можем передать значение без нажатия кнопки. (процесс повторяется, но мне нужно нажать только одну кнопку, нужно выполнить автоматически при отображении графического интерфейса)

def GUI():

   window =Tk()
   window.title("Select First Color")
   selected = IntVar()   

   rad1 = Radiobutton(window, text='RED', value=1, variable=selected)     
   rad2 = Radiobutton(window, text='YELLOW', value=2, variable=selected)

        def clicked():   
             # Go to a function according to the selection of radio button

   button1 = Button(window, text="Select", command=clicked)                    
   button2 = Button(window, text="Quit", command=window.destroy)

   rad1.grid(column=0, row=0)              # GUI RadioButton Placement
   rad2.grid(column=1, row=0)
   button1.grid(column=6, row=0)               # GUI Button Placement
   button2.grid(column=6, row=1)

window.mainloop()

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

1- вы никогда не звоните своему GUI
2- переменные, определенные внутри функции, имеют локальную область видимости, к ним нельзя получить доступ извне, кроме случаев, когда вы объявляете их в глобальной области видимости и используете global для изменения их значений.

Следующее делает то, что вы ожидаете:

если не выбрана ни одна радиокнопка, click печатает 0
когда выбран переключатель «КРАСНЫЙ», click печатает 1
при нажатии кнопки «ЖЕЛТЫЙ» click печатает 2
Вы можете использовать эти значения для перенаправления вызова в другую функцию.

import tkinter as tk


def do_nothing():
    pass


def do_red():
    print('doing the red thing')


def do_yellow():
    print('doing the yellow thing')


def clicked():
    print(f'clicked {selected.get()}')
    v = selected.get()
    if v == 0:
        do_nothing()
    elif v == 1:
        do_red()
    elif v == 2:
        do_yellow()
    else:
        print('an error occurred, the wrong value was recieved')


def GUI():

    global rad1, rad2, selected

    window = tk.Tk()
    window.title("Select First Color")
    selected = tk.IntVar()   

    rad1 = tk.Radiobutton(window, text='RED', value=1, variable=selected)     
    rad2 = tk.Radiobutton(window, text='YELLOW', value=2, variable=selected)

    button1 = tk.Button(window, text="Select", command=clicked)                    
    button2 = tk.Button(window, text="Quit", command=window.destroy)

    rad1.grid(column=0, row=0)
    rad2.grid(column=1, row=0)
    button1.grid(column=6, row=0)
    button2.grid(column=6, row=1)

    window.mainloop()


rad1, rad2, selected = None, None, None
GUI()

Кроме того, вы можете использовать классы, чтобы избежать глобальных переменных:

import tkinter as tk


def do_nothing():
    pass


def do_red():
    print('doing the red thing')


def do_yellow():
    print('doing the yellow thing')


class GUI(tk.Tk):

    def __init__(self):
        super().__init__()
        self.title("Select First Color")
        self.selected = tk.IntVar()
        self.selected.set(0)

        self.rad1 = tk.Radiobutton(self, text='RED', value=1, variable=self.selected)     
        self.rad2 = tk.Radiobutton(self, text='YELLOW', value=2, variable=self.selected)

        self.button1 = tk.Button(self, text="Select", command=self.clicked)                    
        self.button2 = tk.Button(self, text="Quit", command=self.destroy)

        self.rad1.grid(column=0, row=0)
        self.rad2.grid(column=1, row=0)
        self.button1.grid(column=6, row=0)
        self.button2.grid(column=6, row=1)

        self.mainloop()

    def clicked(self):
        print(f'clicked {self.selected.get()}')

        v = self.selected.get()
        if v == 0:
            do_nothing()
        elif v == 1:
            do_red()
        elif v == 2:
            do_yellow()
        else:
            print('an error occurred, the wrong value was received')


GUI()
0 голосов
/ 28 августа 2018

Tkinter является однопоточным, что означает, что он может выполнять только одно действие одновременно. Если ваша функция clicked занимает много времени, tkinter не сможет отвечать на события во время работы.

Единственный выбор, который у вас есть, - это переместить работу, выполненную clicked, в отдельный поток или процесс или реорганизовать ее так, чтобы она периодически вызывала метод update, чтобы tkinter мог работать через очередь событий. .

См. Этот вопрос для получения дополнительной справки: Tkinter: Как использовать потоки для предотвращения "зависания" цикла главных событий

0 голосов
/ 28 августа 2018

Я думаю, это то, что вы ищете

button2 = Button(window, text="Quit", command=sys.exit)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...