getobutton get не работает внутри функции - PullRequest
2 голосов
/ 07 января 2020

Я хотел бы иметь окно с одной кнопкой (с текстом «Клик»). Когда я нажимаю кнопку, должно открыться новое окно. И в этом втором окне я хотел бы иметь 2 радиокнопки и кнопку (с текстом «Печать»). Нажатие на эту кнопку («Печать») должно вывести текущее значение переменной my_variable , которая указывает, какая радиопереключатель выбрана.

Первый код пропускает первое окно, но выводит его на печать правильные значения. Второй код, в который я добавил первое окно (с помощью кнопки «Нажать», открывающую второе окно), всегда печатает значение по умолчанию переменной my_variable . Что я должен изменить, чтобы получать текущее значение при каждом нажатии кнопки «Печать»?

Я использую tkinter с Python 3.7.

Рабочий код:

import tkinter as tk

def function():
    """That function print the current value of my_variable, depending on which radiobutton was choosen."""
    value = my_variable.get()
    print(value)   

window = tk.Tk()
window.title("Title")
window.geometry('200x200')

my_variable = tk.IntVar(value=0)

rbtn1 = tk.Radiobutton(window, text='one', value=1, variable=my_variable)
rbtn1.grid(row=0, column=0)
rbtn2 = tk.Radiobutton(window, text='two', value=2, variable=my_variable)
rbtn2.grid(row=1, column=0)


button = tk.Button(window, text="Print", command=function)
button.grid(row=2, column=0)
window.mainloop()

Не рабочий код:

import tkinter as tk

def on_click():
    def function():
    """That function shoud print the current value of my_variable, depending on which radiobutton was choosen. But it prints the default value instead."""
        value = my_variable.get()
        print(value)   

    window = tk.Tk()
    window.title("Title")
    window.geometry('200x200')

    my_variable = tk.IntVar(value=0)

    rbtn1 = tk.Radiobutton(window, text='one', value=1, variable=my_variable)
    rbtn1.grid(row=0, column=0)
    rbtn2 = tk.Radiobutton(window, text='two', value=2, variable=my_variable)
    rbtn2.grid(row=1, column=0)


    button = tk.Button(window, text="Print", command=function)
    button.grid(row=2, column=0)

window_main = tk.Tk()
window_main.title("Title main")
window_main.geometry('400x400')

button = tk.Button(window_main, text="Click", command=lambda: on_click())
button.grid(row=0, column=0)

window_main.mainloop()

Ответы [ 2 ]

3 голосов
/ 07 января 2020

Проблема в том, что вы звоните tk.Tk() дважды. Если вы хотите создать другое окно, используйте tk.Toplevel().

Чтобы решить вашу проблему, просто измените одну строку, указанную ниже:

import tkinter as tk

def on_click():
    def function():
        """That function should print the current value of my_variable, depending on which radiobutton was chosen. But it prints the default value instead."""
        value = my_variable.get()
        print(value)

    window = tk.Toplevel()  # CHANGED.
    window.title("Title")
    window.geometry('200x200')

    my_variable = tk.IntVar(value=0)

    rbtn1 = tk.Radiobutton(window, text='one', value=1, variable=my_variable)
    rbtn1.grid(row=0, column=0)
    rbtn2 = tk.Radiobutton(window, text='two', value=2, variable=my_variable)
    rbtn2.grid(row=1, column=0)


    button = tk.Button(window, text="Print", command=function)
    button.grid(row=2, column=0)

window_main = tk.Tk()
window_main.title("Title main")
window_main.geometry('400x400')

button = tk.Button(window_main, text="Click", command=lambda: on_click())
button.grid(row=0, column=0)

window_main.mainloop()
0 голосов
/ 07 января 2020

См .:

  • Когда вы нажимаете кнопку в главном окне, она вызывает on_click.
  • Внутри on_click, вы каждый раз передаете значение переменной: my_variable = tk.IntVar(value=0).

Вот почему значение my_variable не сохраняется между щелчками кнопки в главном окне.

Вам необходимо оставить my_variable снаружи on_click и инициализируйте его один раз, а не при каждом нажатии.

Хороший способ сделать это - заставить on_click принять его в качестве параметра: def on_click(my_variable) и command=lambda: on_click(my_variable).

Быстрый и довольно грязный способ - использовать global; это приемлемо в одноразовом скрипте, но быстро станет уродливым и трудно рассуждать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...