переключатели не работают, когда открыт другой ткинтер - PullRequest
0 голосов
/ 09 января 2019

Почему при использовании Python Tkinter открытое окно меняет поведение переключателей в каком-либо другом окне?

#!/usr/bin/env python3

import tkinter as tk

def close_button():
    raise SystemExit

# open first window
root1 = tk.Tk()

# open second window and display radio buttons
root2 = tk.Tk()
root2.protocol('WM_DELETE_WINDOW', close_button)
var = tk.IntVar()
var.set(1)
tk.Radiobutton(root2, variable = var, value = 1).pack()
tk.Radiobutton(root2, variable = var, value = 2).pack()
tk.Radiobutton(root2, variable = var, value = 3).pack()
tk.Button(root2, text = 'print selection', command = lambda : print(var.get())).pack()

root1.mainloop()
root2.mainloop()

Эта программа открывает два окна, соответствующие root1 и root2. Вот как выглядит второе окно.

greyed out radio buttons

Серые точки исчезают, если я нажимаю любую из переключателей, как показано ниже.

misbehaving radio buttons

Однако при нажатии кнопки print selection выводится «1» независимо от выбора!

С другой стороны, если root1 не создано, переключатели не ведут себя неправильно.

no errors

При нажатии на print selection печатается правильное значение: «1», «2» или «3», в зависимости от того, какой из трех выбран.

Итак, мой вопрос: почему переключатели root2 плохо работают, когда открыто другое окно root1? (Я использую классы в своей программе, но в этом примере я сократил их до минимума.)

Запись оператора root1.mainloop() сразу под root1 = tk.Tk() не вариант, потому что мое приложение должно одновременно открывать оба окна.

1 Ответ

0 голосов
/ 09 января 2019

Вы никогда не используете Tk() дважды в приложении. Вместо этого вам нужно использовать одно корневое окно с Tk(), и для каждого нового окна после этого вам нужно использовать Toplevel().

Сделайте это вместо:

#!/usr/bin/env python3
import tkinter as tk


def close_button():
    raise SystemExit

root = tk.Tk()
top = tk.Toplevel(root)
top.protocol('WM_DELETE_WINDOW', close_button)
var = tk.IntVar()
var.set(1)

tk.Radiobutton(top, variable=var, value=1).pack()
tk.Radiobutton(top, variable=var, value=2).pack()
tk.Radiobutton(top, variable=var, value=3).pack()
tk.Button(top, text='print selection', command=lambda : print(var.get())).pack()
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...