【问题标题】:Python Tkinter: Inheritance Syntax or Reference mistake?Python Tkinter:继承语法或引用错误?
【发布时间】:2015-08-19 04:46:44
【问题描述】:

我是 python 的初学者,我正在尝试创建一个类似于记分牌的 GUI。我做了一个事件,根据 Combobox 选择通过按钮修改我的统计信息。在小部件的代码之后有 4 个非常小的函数,第一个按预期工作,其他 3 个类似但它们只影响最后 3 个标签而不是 Combobox 选择标签。我在那里想念什么?

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

【问题讨论】:

标签: python inheritance syntax reference tkinter


【解决方案1】:

对于您的单选按钮,您应该使用类属性(在我的代码中为 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()

【讨论】:

    猜你喜欢
    • 2014-12-13
    • 2016-03-10
    • 2021-03-15
    • 2012-09-16
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    相关资源
    最近更新 更多