Python Tkinter:继承语法或引用错误?
Python Tkinter: Inheritance Syntax or Reference mistake?
我是 python 的初学者,我正在尝试创建一个类似记分牌的 GUI。我做了一个事件,根据组合框选择通过按钮修改我的统计数据。小部件代码后有 4 个非常小的函数,第一个按预期工作,其他 3 个类似但它们只影响最后 3 个标签而不是组合框选择标签。我在那里想念什么?
from Tkinter import *
import ttk
class Application(Frame):
def __init__(self, master):
Frame.__init__(self, master, relief="sunken", border=1)
self.master = master
self.box_list = []
self.labels = []
self.radiobuttons = []
self.winlabels = []
self.loselabels = []
self.drawlabels = []
self.create_widgets()
self.grid()
def create_widgets(self):
for i in range(9):
box = ttk.Combobox(self, state="readonly")
box.grid(row=1+i, column=2)
box["values"] = ("team A", "team B", "team C", "team D", "team E", "team F", "team G", "team H", "team I")
box.current(i)
self.box_list.append(box)
box.bind("<<ComboboxSelected>>")
for i in range(9):
sv = 1
selection = i
radiobutton = Radiobutton(self, value=selection, text=selection+1, variable=sv,
command=lambda i=i: self.rcr(i))
radiobutton.grid(row=1+i, column=0)
self.radiobuttons.append(radiobutton)
self.headings = ("Classes", "Win Lose Draw", "Declare Result!")
for i in range(3):
label = Label(self, text=self.headings, relief="sunken")
label["text"] = self.headings[i]
label.grid(row=0, column=i*3+1, columnspan=3, sticky=E+W+N+S)
for i in range(9):
stats = Label(self, relief="sunken")
stats["text"] = 0
stats.grid(row=1+i, column=4, sticky=E+W+N+S)
self.winlabels.append(stats)
for i in range(9):
stats = Label(self, relief="sunken")
stats["text"] = 0
stats.grid(row=1+i, column=5, sticky=E+W+N+S)
self.loselabels.append(stats)
for i in range(9):
stats = Label(self, relief="sunken")
stats["text"] = 0
stats.grid(row=1+i, column=6, sticky=E+W+N+S)
self.drawlabels.append(stats)
buttonwin = Button(self, text="Win", bg="green", command=lambda i=i: self.win(i))
buttonwin.grid(row=1, column=7, pady=1, padx=1, rowspan=3, columnspan=3, sticky=E+W+N+S)
buttonlose = Button(self, text="Lose", bg="red", command=lambda i=i: self.lose(i))
buttonlose.grid(row=4, column=7, pady=1, padx=1, rowspan=3, columnspan=3, sticky=E+W+N+S)
buttondraw = Button(self, text="Draw", bg="white", command=lambda i=i: self.draw(i))
buttondraw.grid(row=7, column=7, pady=1, padx=1, rowspan=3, columnspan=3, sticky=E+W+N+S)
def rcr(self, i):
tr = self.radiobuttons[i]["text"]
print tr
def win(self, i):
self.winlabels[i]["text"] += 1
def lose(self, i):
self.loselabels[i]["text"] += 1
def draw(self,i):
self.drawlabels[i]["text"] += 1
root = Tk()
root.title("Stats Tracker")
root.geometry("500x250")
app = Application(root)
root.mainloop()
对于单选按钮,您应该使用 class 属性(在我的代码中为 RBval)作为变量来控制所选值。您不需要将所有单选按钮存储在一个变量中。
然后,在您的赢、输、平局函数中,您无需输入所选单选按钮的数字。您刚刚读取了 RBval 的值。在您的代码中, i 始终等于 9 因为它是 i 在您的 forloop 中的最后一个值。
代码中可能还有很多遗留问题,但这是您的代码的工作版本:
from Tkinter import *
import ttk
class Application(Frame):
def __init__(self, master):
Frame.__init__(self, master, relief="sunken", border=1)
self.master = master
self.box_list = []
self.labels = []
self.radiobuttons = []
self.winlabels = []
self.loselabels = []
self.drawlabels = []
self.create_widgets()
self.grid()
def create_widgets(self):
for i in range(9):
box = ttk.Combobox(self, state="readonly")
box.grid(row=1+i, column=2)
box["values"] = ("team A", "team B", "team C", "team D", "team E", "team F", "team G", "team H", "team I")
box.current(i)
self.box_list.append(box)
box.bind("<<ComboboxSelected>>")
self.RBval = IntVar()
for i in range(9):
selection = i
radiobutton = Radiobutton(self, value=selection, text=selection+1, variable=self.RBval)
radiobutton.grid(row=1+i, column=0)
self.radiobuttons.append(radiobutton)
self.headings = ("Classes", "Win Lose Draw", "Declare Result!")
for i in range(3):
label = Label(self, text=self.headings, relief="sunken")
label["text"] = self.headings[i]
label.grid(row=0, column=i*3+1, columnspan=3, sticky=E+W+N+S)
for i in range(9):
stats = Label(self, relief="sunken")
stats["text"] = 0
stats.grid(row=1+i, column=4, sticky=E+W+N+S)
self.winlabels.append(stats)
for i in range(9):
stats = Label(self, relief="sunken")
stats["text"] = 0
stats.grid(row=1+i, column=5, sticky=E+W+N+S)
self.loselabels.append(stats)
for i in range(9):
stats = Label(self, relief="sunken")
stats["text"] = 0
stats.grid(row=1+i, column=6, sticky=E+W+N+S)
self.drawlabels.append(stats)
buttonwin = Button(self, text="Win", bg="green", command=self.win)
buttonwin.grid(row=1, column=7, pady=1, padx=1, rowspan=3, columnspan=3, sticky=E+W+N+S)
buttonlose = Button(self, text="Lose", bg="red", command=self.lose)
buttonlose.grid(row=4, column=7, pady=1, padx=1, rowspan=3, columnspan=3, sticky=E+W+N+S)
buttondraw = Button(self, text="Draw", bg="white", command=self.draw)
buttondraw.grid(row=7, column=7, pady=1, padx=1, rowspan=3, columnspan=3, sticky=E+W+N+S)
def win(self):
i = self.RBval.get()
self.winlabels[i]["text"] += 1
def lose(self):
i = self.RBval.get()
self.loselabels[i]["text"] += 1
def draw(self):
i = self.RBval.get()
self.drawlabels[i]["text"] += 1
root = Tk()
root.title("Stats Tracker")
root.geometry("500x250")
app = Application(root)
root.mainloop()
我是 python 的初学者,我正在尝试创建一个类似记分牌的 GUI。我做了一个事件,根据组合框选择通过按钮修改我的统计数据。小部件代码后有 4 个非常小的函数,第一个按预期工作,其他 3 个类似但它们只影响最后 3 个标签而不是组合框选择标签。我在那里想念什么?
from Tkinter import *
import ttk
class Application(Frame):
def __init__(self, master):
Frame.__init__(self, master, relief="sunken", border=1)
self.master = master
self.box_list = []
self.labels = []
self.radiobuttons = []
self.winlabels = []
self.loselabels = []
self.drawlabels = []
self.create_widgets()
self.grid()
def create_widgets(self):
for i in range(9):
box = ttk.Combobox(self, state="readonly")
box.grid(row=1+i, column=2)
box["values"] = ("team A", "team B", "team C", "team D", "team E", "team F", "team G", "team H", "team I")
box.current(i)
self.box_list.append(box)
box.bind("<<ComboboxSelected>>")
for i in range(9):
sv = 1
selection = i
radiobutton = Radiobutton(self, value=selection, text=selection+1, variable=sv,
command=lambda i=i: self.rcr(i))
radiobutton.grid(row=1+i, column=0)
self.radiobuttons.append(radiobutton)
self.headings = ("Classes", "Win Lose Draw", "Declare Result!")
for i in range(3):
label = Label(self, text=self.headings, relief="sunken")
label["text"] = self.headings[i]
label.grid(row=0, column=i*3+1, columnspan=3, sticky=E+W+N+S)
for i in range(9):
stats = Label(self, relief="sunken")
stats["text"] = 0
stats.grid(row=1+i, column=4, sticky=E+W+N+S)
self.winlabels.append(stats)
for i in range(9):
stats = Label(self, relief="sunken")
stats["text"] = 0
stats.grid(row=1+i, column=5, sticky=E+W+N+S)
self.loselabels.append(stats)
for i in range(9):
stats = Label(self, relief="sunken")
stats["text"] = 0
stats.grid(row=1+i, column=6, sticky=E+W+N+S)
self.drawlabels.append(stats)
buttonwin = Button(self, text="Win", bg="green", command=lambda i=i: self.win(i))
buttonwin.grid(row=1, column=7, pady=1, padx=1, rowspan=3, columnspan=3, sticky=E+W+N+S)
buttonlose = Button(self, text="Lose", bg="red", command=lambda i=i: self.lose(i))
buttonlose.grid(row=4, column=7, pady=1, padx=1, rowspan=3, columnspan=3, sticky=E+W+N+S)
buttondraw = Button(self, text="Draw", bg="white", command=lambda i=i: self.draw(i))
buttondraw.grid(row=7, column=7, pady=1, padx=1, rowspan=3, columnspan=3, sticky=E+W+N+S)
def rcr(self, i):
tr = self.radiobuttons[i]["text"]
print tr
def win(self, i):
self.winlabels[i]["text"] += 1
def lose(self, i):
self.loselabels[i]["text"] += 1
def draw(self,i):
self.drawlabels[i]["text"] += 1
root = Tk()
root.title("Stats Tracker")
root.geometry("500x250")
app = Application(root)
root.mainloop()
对于单选按钮,您应该使用 class 属性(在我的代码中为 RBval)作为变量来控制所选值。您不需要将所有单选按钮存储在一个变量中。
然后,在您的赢、输、平局函数中,您无需输入所选单选按钮的数字。您刚刚读取了 RBval 的值。在您的代码中, i 始终等于 9 因为它是 i 在您的 forloop 中的最后一个值。
代码中可能还有很多遗留问题,但这是您的代码的工作版本:
from Tkinter import *
import ttk
class Application(Frame):
def __init__(self, master):
Frame.__init__(self, master, relief="sunken", border=1)
self.master = master
self.box_list = []
self.labels = []
self.radiobuttons = []
self.winlabels = []
self.loselabels = []
self.drawlabels = []
self.create_widgets()
self.grid()
def create_widgets(self):
for i in range(9):
box = ttk.Combobox(self, state="readonly")
box.grid(row=1+i, column=2)
box["values"] = ("team A", "team B", "team C", "team D", "team E", "team F", "team G", "team H", "team I")
box.current(i)
self.box_list.append(box)
box.bind("<<ComboboxSelected>>")
self.RBval = IntVar()
for i in range(9):
selection = i
radiobutton = Radiobutton(self, value=selection, text=selection+1, variable=self.RBval)
radiobutton.grid(row=1+i, column=0)
self.radiobuttons.append(radiobutton)
self.headings = ("Classes", "Win Lose Draw", "Declare Result!")
for i in range(3):
label = Label(self, text=self.headings, relief="sunken")
label["text"] = self.headings[i]
label.grid(row=0, column=i*3+1, columnspan=3, sticky=E+W+N+S)
for i in range(9):
stats = Label(self, relief="sunken")
stats["text"] = 0
stats.grid(row=1+i, column=4, sticky=E+W+N+S)
self.winlabels.append(stats)
for i in range(9):
stats = Label(self, relief="sunken")
stats["text"] = 0
stats.grid(row=1+i, column=5, sticky=E+W+N+S)
self.loselabels.append(stats)
for i in range(9):
stats = Label(self, relief="sunken")
stats["text"] = 0
stats.grid(row=1+i, column=6, sticky=E+W+N+S)
self.drawlabels.append(stats)
buttonwin = Button(self, text="Win", bg="green", command=self.win)
buttonwin.grid(row=1, column=7, pady=1, padx=1, rowspan=3, columnspan=3, sticky=E+W+N+S)
buttonlose = Button(self, text="Lose", bg="red", command=self.lose)
buttonlose.grid(row=4, column=7, pady=1, padx=1, rowspan=3, columnspan=3, sticky=E+W+N+S)
buttondraw = Button(self, text="Draw", bg="white", command=self.draw)
buttondraw.grid(row=7, column=7, pady=1, padx=1, rowspan=3, columnspan=3, sticky=E+W+N+S)
def win(self):
i = self.RBval.get()
self.winlabels[i]["text"] += 1
def lose(self):
i = self.RBval.get()
self.loselabels[i]["text"] += 1
def draw(self):
i = self.RBval.get()
self.drawlabels[i]["text"] += 1
root = Tk()
root.title("Stats Tracker")
root.geometry("500x250")
app = Application(root)
root.mainloop()