我有一個tkinter帶有兩個單選按鈕的簡單視窗。如果我選擇“是”,則會添加一個帶有其他兩個單選按鈕的新行。每次單擊“是”時,我都會嘗試使用相同的功能,但是如果將滑鼠移到單選按鈕上,則會自動選擇單選按鈕。
這是我的代碼:
from tkinter import *
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.i = 1
self.Frame1 = Frame(self)
self.Frame1.grid(row=0, column=0)
self.label = tk.Label(self.Frame1, text='Select Yes or No')
self.label.grid(row=0, column=0)
self.radioValueYesOrNo = tk.IntVar()
self.RadiobuttonYesOrNo = tk.Radiobutton(self.Frame1, text='Yes',
variable=self.radioValueYesOrNo,
value=1,
command=self.addWidgets
)
self.RadiobuttonYesOrNo.grid(row=0, column=1)
self.RadiobuttonNonBoostPresent = tk.Radiobutton(self.Frame1, text='No',
variable=self.radioValueYesOrNo,
value=2)
self.RadiobuttonNonBoostPresent.grid(row=0, column=2, padx=20)
def addWidgets(self):
valueRadioButton = self.returnValueRadiobutton()
if valueRadioButton == 1:
self.label = tk.Label(self.Frame1, text='Select Yes or No')
self.label.grid(row=self.i, column=0)
self.radioValueYesOrNo = tk.IntVar()
self.RadiobuttonYesOrNo = tk.Radiobutton(self.Frame1, text='Yes',
variable=self.radioValueYesOrNo,
value=1,
command=self.addWidgets
)
self.RadiobuttonYesOrNo.grid(row=self.i, column=1)
self.RadiobuttonNonBoostPresent = tk.Radiobutton(self.Frame1, text='No',
variable=self.radioValueYesOrNo,
value=2)
self.RadiobuttonNonBoostPresent.grid(row=self.i, column=2, padx=20)
self.i = self.i 1
def returnValueRadiobutton(self):
return self.radioValueYesOrNo.get()
if __name__ == "__main__":
app = Application()
app.mainloop()
有人知道如何解決這個問題嗎?這是撰寫代碼的最佳方式嗎?
uj5u.com熱心網友回復:
你離得不遠,但是你需要移動你的覆寫,self.i所以你的.grid呼叫已經使用更新的值(編輯:我錯了,你最初使用 0 并將 i 設定為 1,所以這應該沒有問題)。一般來說,我建議您使用串列、字典或某種存盤小部件的方式,以便以后可以訪問它們。我認為在您的示例中,您一直在覆寫相同的變數,這就是它被搞砸的原因。我修改了您的代碼并添加了兩個可選部分,您可以在其中洗掉已經生成新對的復選框的回呼,甚至禁用舊的回呼。但是,我希望我的解決方案是明確的,可以幫助你開始:
from tkinter import *
import tkinter as tk
from functools import partial
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.i = 1
self.Frame1 = Frame(self)
self.Frame1.grid(row=0, column=0)
self.label = tk.Label(self.Frame1, text='Select Yes or No')
self.label.grid(row=0, column=0)
self.values = []
self.radiobuttons_yes = []
self.radiobuttons_no = []
self.add_radiobuttons() # adds the first pair
def add_radiobuttons(self):
"""Adds a new set of radiobuttons and appends radiobutton_callback with the current index as command"""
self.values.append(tk.IntVar())
self.radiobuttons_yes.append(tk.Radiobutton(self.Frame1, text='Yes',
variable=self.values[-1],
value=1,
command=partial(self.radiobutton_callback, len(self.values) - 1)))
self.radiobuttons_yes[-1].grid(row=self.i, column=0)
self.radiobuttons_no.append(tk.Radiobutton(self.Frame1, text='No',
variable=self.values[-1],
value=2,
command=partial(self.radiobutton_callback, len(self.values) - 1)))
self.radiobuttons_no[-1].grid(row=self.i, column=1)
self.i = 1
def radiobutton_callback(self, index):
"""Callback function for the radiobuttons"""
if self.values[index].get() == 1:
# optional: delete command of current radiobuttons to prevent multiple calls
self.radiobuttons_yes[index].config(command='')
self.radiobuttons_no[index].config(command='')
# # optional2: set previous radiobuttons to inactivate
# self.radiobuttons_yes[index].config(state=DISABLED)
# self.radiobuttons_no[index].config(state=DISABLED)
# add new radiobuttons
self.add_radiobuttons()
if __name__ == "__main__":
app = Application()
app.mainloop()
uj5u.com熱心網友回復:
def addWidgets(self):
valueRadioButton = self.returnValueRadiobutton()
if valueRadioButton == 1:
label = tk.Label(self.Frame1, text='Select Yes or No')
label.grid(row=self.i, column=0)
print("creating")
radioValueYesOrNo = tk.IntVar()
RadiobuttonYesOrNo = tk.Radiobutton(self.Frame1, text='Yes',
variable=radioValueYesOrNo,
value=1,
command=lambda: self.addWidgets()
)
RadiobuttonYesOrNo.grid(row=self.i, column=1)
RadiobuttonNonBoostPresent = tk.Radiobutton(self.Frame1, text='No',
variable=radioValueYesOrNo,
value=2)
RadiobuttonNonBoostPresent.grid(row=self.i, column=2, padx=20)
self.i = self.i 1
我們想創建一個新的自己的按鈕物件對吧?所以我們不能對不同的按鈕使用相同的變數self.radioValueYesOrNoand 。self.RadiobuttonYesOrNoself.RadiobuttonNonBoostPresent
是的,解決方案是在函式范圍內制作它們的變數。希望它有幫助,玩得開心:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/474304.html
