pythontkinter:继承语法还是引用错误?

2024-04-19 18:04:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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()

Tags: textinselfboxfordefstatsrange
1条回答
网友
1楼 · 发布于 2024-04-19 18:04:52

对于单选按钮,应该使用类属性(我的代码中的RBval)作为变量来控制所选值。您不需要将所有单选按钮都存储在一个变量中。你知道吗

然后,在你的赢,输,抽签功能中你不需要把号码放在选中的单选按钮上。您只需读取RBval的值。在您的代码中,i始终等于9,因为它是forloop中i的最后一个值。你知道吗

代码中可能还有很多问题,但下面是代码的工作版本:

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()

相关问题 更多 >