Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter重新初始化时移动画布_Python_Object_Tkinter - Fatal编程技术网

Python tkinter重新初始化时移动画布

Python tkinter重新初始化时移动画布,python,object,tkinter,Python,Object,Tkinter,我试图在tkinter中创建一个网格板,每当我按下重新启动按钮时,我希望它在同一位置创建一个新的网格板。我不是在重新绘制黑板,而是在重新初始化这个类 我的问题是,它确实为我创建了一个新的董事会,但董事会向下移动了50%,我不知道为什么。下面是我使用的代码和一些图片来说明我的问题。提前谢谢 import tkinter as tk from tkinter import ttk, Tk class GUI(tk.Frame): def __init__(self):

我试图在tkinter中创建一个网格板,每当我按下重新启动按钮时,我希望它在同一位置创建一个新的网格板。我不是在重新绘制黑板,而是在重新初始化这个类

我的问题是,它确实为我创建了一个新的董事会,但董事会向下移动了50%,我不知道为什么。下面是我使用的代码和一些图片来说明我的问题。提前谢谢

import tkinter as tk
from tkinter import ttk, Tk


class GUI(tk.Frame):    
    def __init__(self):
        super().__init__()
        self.pack(fill=tk.BOTH, expand=True)
        self.canvas = tk.Canvas(self)
        self.create_board()

    def create_board(self):
        for y in range(3):
            for x in range(3):
                x1 = x * 150 + 30
                x2 = x1 + 150
                y1 = y * 150 + 30
                y2 = y1 + 150
                self.canvas.create_rectangle(x1, y1, x2, y2, outline="#090808", fill="#fffdfd")
                self.canvas.pack(fill=tk.BOTH, expand=True)
        button = ttk.Button(self.canvas, text='Restart', command=self.restart)
        button.place(x=150*3/2, y=150*3+50)

    def restart(self):
        self.canvas.destroy()
        self.__init__()


def main():
    root = Tk()
    GUI()
    root.geometry("550x550")
    root.mainloop()


if __name__ == '__main__':
    main()


您不应该一直调用
\uuuu init\uuuu()
方法。相反,它只能在第一次初始化时使用。绕过它的一种方法是创建另一个方法并重新初始化它

以下是更正后的代码:

import tkinter as tk
from tkinter import ttk, Tk


class GUI(tk.Frame):    
    def __init__(self):
        super().__init__()
        self.reinitialize()

    def reinitialize(self):
        self.pack(fill=tk.BOTH, expand=True)
        self.canvas = tk.Canvas(self)
        self.create_board()
        
    
    def create_board(self):
        print()
        for y in range(3):
            for x in range(3):
                x1 = x * 150 + 30
                x2 = x1 + 150
                y1 = y * 150 + 30
                y2 = y1 + 150
               
                self.canvas.create_rectangle(x1, y1, x2, y2, outline="#090808", fill="#fffdfd")
                self.canvas.pack(fill=tk.BOTH, expand=True)
        button = ttk.Button(self.canvas, text='Restart', command=self.restart)
        button.place(x=150*3/2, y=150*3+50)

    def restart(self):
        self.canvas.destroy()

        self.reinitialize()
        #self.__init__()



def main():
    root = Tk()
    GUI()
 
    root.geometry("550x550")
    root.mainloop()


if __name__ == '__main__':
    main()

您不应该一直调用
\uuuu init\uuuu()
方法。相反,它只能在第一次初始化时使用。绕过它的一种方法是创建另一个方法并重新初始化它

以下是更正后的代码:

import tkinter as tk
from tkinter import ttk, Tk


class GUI(tk.Frame):    
    def __init__(self):
        super().__init__()
        self.reinitialize()

    def reinitialize(self):
        self.pack(fill=tk.BOTH, expand=True)
        self.canvas = tk.Canvas(self)
        self.create_board()
        
    
    def create_board(self):
        print()
        for y in range(3):
            for x in range(3):
                x1 = x * 150 + 30
                x2 = x1 + 150
                y1 = y * 150 + 30
                y2 = y1 + 150
               
                self.canvas.create_rectangle(x1, y1, x2, y2, outline="#090808", fill="#fffdfd")
                self.canvas.pack(fill=tk.BOTH, expand=True)
        button = ttk.Button(self.canvas, text='Restart', command=self.restart)
        button.place(x=150*3/2, y=150*3+50)

    def restart(self):
        self.canvas.destroy()

        self.reinitialize()
        #self.__init__()



def main():
    root = Tk()
    GUI()
 
    root.geometry("550x550")
    root.mainloop()


if __name__ == '__main__':
    main()

谢谢,那很有帮助,汉克斯,那很有帮助