【问题标题】:Python TkInter grid issuesPython TkInter 网格问题
【发布时间】:2017-06-14 18:03:39
【问题描述】:

我在 TkInter 中有一个网格:

from tkinter import *

class App():
    def __init__(self, root):
        self.root = root
        self.TopFrame = Frame(root)
        self.MiddleFrame = Frame(root)
        self.BottomFrame = Frame(root)
        self.TopFrame.grid(row=0)
        self.MiddleFrame.grid(row=5)
        self.BottomFrame.grid(row=6)

        buttonQ = Button(self.BottomFrame, text="Quit", command=quit)
        buttonS = Button(self.BottomFrame, text="Save", command=self.saveToFile)
        buttonS.grid(row=0, column=0, padx=10)
        buttonQ.grid(row=0, column=1, padx=10)
def Function(self):
    self.grid = []
    for i in range(5):
        row = []
        for j in range(5):
            row.append(Button(self.TopFrame,width=6,height=3,command=lambda i=i, j=j: self.getClick(i, j),background='gray'))
            row[-1].grid(row=i,column=j)
        self.grid.append(row)
    row2 = []
    for k in range(4):
        row2.append(Button(self.MiddleFrame,width=6,height=3,command=lambda i=5, k=k: self.getClick(i, k),background='gray'))
        row2[-1].grid(row=6,column=k, pady=10)  

def getClick(self, i, j):
    orig_color = self.grid[i][j].cget('bg')
    if orig_color=="red":
        self.grid[i][j]["bg"]="gray"
    else:
        self.grid[i][j]["bg"]="red"

def saveToFile(self):
    myFile=open("example.txt", 'w')
    for line in range(5):
        for column in range(5):
            bg_color = self.grid[line][column].cget('bg')
            if bg_color == "red":
                myFile.write("1 ")
            else:
                myFile.write("0 ")
        myFile.write("\n")
    for column in range(4):
        bg_color2 = self.grid[5][column].cget('bg')
        if bg_color2 == "red":
            myFile.write("1 ")
        else:
            myFile.write("0 ")
    myFile.write("\n")
    myFile.close()
    myFile = open("example.txt",'r')
    print(myFile.read())
    myFile.close()

root = Tk()
app = App(root)
app.Function()
root.mainloop()

但问题是中间网格中的按钮在单击时不会改变颜色,它会返回此错误:

line 1699, in __call__
return self.func(*args)
line 28, in <lambda>
    row2.append(Button(self.MiddleFrame,width=6,height=3,command=lambda i=5, k=k: self.getClick(i, k),background='gray'))
line 32, in getClick
    orig_color = self.grid[i][j].cget('bg')
IndexError: list index out of range

当我按下Save 按钮时:

  line 1699, in __call__
return self.func(*args)  
line 39, in saveToFile
    myFile=open("example.txt", 'w')
PermissionError: [Errno 13] Permission denied: 'example.txt'

我做错了什么?

【问题讨论】:

    标签: python tkinter grid


    【解决方案1】:

    编辑:

    在弄乱您的代码几分钟后,我注意到您丢失了 self.grid.append(row2)

    因此,将方法的缩进固定在类内部,并在 row2 = [] 下的 for 循环之后添加 self.grid.append(row2),如下所示:

    row2 = []
    for k in range(4):
        row2.append(Button(self.MiddleFrame,width=6,height=3,command=lambda i=5, k=k: self.getClick(i, k),background='gray'))
        row2[-1].grid(row=6,column=k, pady=10)
    self.grid.append(row2)
    

    现在工作正常。看这张图片:

    【讨论】:

      【解决方案2】:

      对于第一个错误,我认为你需要补充:

      self.grid.append(row2)
      

      在 Function 函数末尾的第 55 行第 11 列,因为这会将其添加到 self.grid 对象并允许在 self.getClick 中访问按钮。

      第二个错误通常发生在您自己打开文本文件时。尝试关闭它,看看是否有帮助

      【讨论】:

      • 你是对的。我为反对票道歉。但是,在您对您的帖子进行编辑之前,我无法更正我的投票。也许指出他应该把self.grid.append(row2)放在哪里,然后我可以更新我的投票:D
      • @SierraMountainTech 我确实说过她应该在函数函数的末尾添加我。不过我会更新答案更具体,谢谢你的建议:)
      • 是的,我明白了……我今天刚下班。别管我。我需要打个盹哈哈。
      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2016-05-25
      • 2018-05-17
      • 1970-01-01
      相关资源
      最近更新 更多