Python Tkinter程序在第一次尝试时无法正常工作,重新启动后可以正常工作

Python Tkinter程序在第一次尝试时无法正常工作,重新启动后可以正常工作,python,python-3.x,oop,tkinter,tkinter-canvas,Python,Python 3.x,Oop,Tkinter,Tkinter Canvas,当我第一次启动程序时,该程序中的GUI程序块不能正常工作,但在我按下重启按钮后,它们似乎工作正常。问题似乎在于启动时未选择正确的方块,但在使用play()方法重新启动后,它似乎工作正常 def play(self, event): """ user performs a move calls computer move directly after if game not over """ selected_square = self.canvas.fin

当我第一次启动程序时,该程序中的GUI程序块不能正常工作,但在我按下重启按钮后,它们似乎工作正常。问题似乎在于启动时未选择正确的方块,但在使用
play()
方法重新启动后,它似乎工作正常

def play(self, event):
    """
    user performs a move
    calls computer move directly after if game not over
    """
    selected_square = self.canvas.find_closest(event.x, event.y)
我尝试将
移动为一个实例变量,但没有解决这个问题

以下是
\uuuu init\uuuu
方法:

class Game(object):
'''
GUI Tic-tac-toe game.

Argument:
parent (tkinter.Tk): the root window object

Attributes:
canvas = (tkinter.Canvas) widget defining game board
game_over = (bool) game state, game over = False, game ongoing = True
moves = (int) number of moves taken by both user and computer
label = (tkinter.Label) shows win/loss/draw message
'''

# Add your class variables if needed here - square size, etc...)
board = [[0, 0, 0],
         [0, 0, 0],
         [0, 0, 0]]

MAX_MOVES = 9

def __init__(self, parent):
    self.parent = parent
    parent.title('Tic Tac Toe')
    # Create the restart button widget
    restart_button = tkinter.Button(self.parent, text='RESTART', width=20,
                                    command=self.restart)
    restart_button.pack()
    # Create a canvas widget

    self.canvas = tkinter.Canvas(parent, background='white', width=300,
                                 height=300)

    self.canvas.create_rectangle(0, 0, 300, 300)
    self.canvas.create_rectangle(0, 0, 100, 100)
    self.canvas.create_rectangle(100, 0, 200, 100)
    self.canvas.create_rectangle(200, 0, 300, 100)

    self.canvas.create_rectangle(0, 100, 100, 200)
    self.canvas.create_rectangle(100, 100, 200, 200)
    self.canvas.create_rectangle(200, 100, 300, 200)

    self.canvas.create_rectangle(0, 200, 100, 300)
    self.canvas.create_rectangle(100, 200, 200, 300)
    self.canvas.create_rectangle(200, 200, 300, 300)

    self.canvas.pack()

    self.label = tkinter.Label(self.parent, text="")
    self.label.pack()

    self.game_over = False
    if not self.game_over:
        self.canvas.bind("<Button-1>", self.play)
    self.moves = 0
类游戏(对象):
'''
guitictac-toe游戏。
论据:
父对象(tkinter.Tk):根窗口对象
属性:
canvas=(tkinter.canvas)定义游戏板的小部件
游戏结束=(bool)游戏状态,游戏结束=假,游戏进行中=真
移动=(int)用户和计算机采取的移动数
label=(tkinter.label)显示赢/输/抽消息
'''
#如果需要,在此处添加类变量-正方形大小等…)
线路板=[[0,0,0],
[0, 0, 0],
[0, 0, 0]]
最大移动量=9
定义初始化(自身,父级):
self.parent=parent
父标题(“Tic Tac Toe”)
#创建重启按钮小部件
重新启动按钮=tkinter.button(self.parent,text='restart',width=20,
命令=self.restart)
重新启动按钮。包()
#创建画布小部件
self.canvas=tkinter.canvas(父级,背景为白色,宽度为300,
高度=300)
self.canvas.create_矩形(0,0,300,300)
self.canvas.create_矩形(0,0,100100)
self.canvas.create_矩形(100,0,200,100)
self.canvas.create_矩形(200,0,300,100)
self.canvas.create_矩形(0、100、100、200)
self.canvas.create_矩形(100100200200)
self.canvas.create_矩形(200100300200)
self.canvas.create_矩形(0、200、100、300)
self.canvas.create_矩形(100200200300)
canvas.create_矩形(200200300300)
self.canvas.pack()
self.label=tkinter.label(self.parent,text=”“)
self.label.pack()
self.game\u over=错误
如果不是self.game\u结束:
self.canvas.bind(“,self.play)
self.moves=0
以下是重新启动方法:

    def restart(self):
    """
    resets game to beginning state

    label erased, game tiles turned back white, button-1 rebound, moves set
    to zero
    """
    for square in self.canvas.find_all():
        self.canvas.itemconfigure(square, fill='white')
    self.board = [[0, 0, 0],
                  [0, 0, 0],
                  [0, 0, 0]]
    self.moves = 0
    self.game_over = False
    self.canvas.bind("<Button-1>", self.play)
    self.label.config(text="")
def重启(自):
"""
将游戏重置为开始状态
标签擦除,游戏牌变白,按钮1反弹,移动设置
归零
"""
对于self.canvas.find_all()中的正方形:
self.canvas.itemconfigure(square,fill='white')
self.board=[[0,0,0],
[0, 0, 0],
[0, 0, 0]]
self.moves=0
self.game\u over=错误
self.canvas.bind(“,self.play)
self.label.config(text=”“)
代码的其余部分可以找到


我试过打印event.x和event.y,它们似乎注册正确,并且更新了棋盘。

游戏开始时画布/绑定配置不正确。我还没有真正深入研究您的代码来找出原因(有很多问题需要深入研究以获得一个简短的答案),但是您的索引在您第一次开始时似乎落后了一个。通过将
restart()
函数中的画布配置循环添加到代码块底部的游戏循环中,可以解决此问题,如下所示:

def main():
    root = tkinter.Tk()
    gen_game = Game(root)
    **for square in gen_game.canvas.find_all():**
        **gen_game.canvas.itemconfigure(square, fill='white')**
    root.mainloop()
def __init__(self, parent):
    self.parent = parent
    parent.title('Tic Tac Toe')


    # Create the restart button widget
    restart_button = tkinter.Button(self.parent, text='RESTART', width=20,
                                    command=self.restart)
    restart_button.pack()
    # Create a canvas widget

    self.canvas = tkinter.Canvas(parent, background='white', width=300,
                                 height=300)

    self.canvas.create_rectangle(0, 0, 300, 300)
    self.canvas.create_rectangle(0, 0, 100, 100)
    self.canvas.create_rectangle(100, 0, 200, 100)
    self.canvas.create_rectangle(200, 0, 300, 100)

    self.canvas.create_rectangle(0, 100, 100, 200)
    self.canvas.create_rectangle(100, 100, 200, 200)
    self.canvas.create_rectangle(200, 100, 300, 200)

    self.canvas.create_rectangle(0, 200, 100, 300)
    self.canvas.create_rectangle(100, 200, 200, 300)
    self.canvas.create_rectangle(200, 200, 300, 300)

    self.canvas.pack()

    self.label = tkinter.Label(self.parent, text="")
    self.label.pack()

    self.game_over = False
    if not self.game_over:
        self.canvas.bind("<Button-1>", self.play)
    self.moves = 0

    **for square in self.canvas.find_all():**
        **self.canvas.itemconfigure(square, fill='white')**
或者将其添加到
\uuuu init\uuu
函数的底部,如下所示:

def main():
    root = tkinter.Tk()
    gen_game = Game(root)
    **for square in gen_game.canvas.find_all():**
        **gen_game.canvas.itemconfigure(square, fill='white')**
    root.mainloop()
def __init__(self, parent):
    self.parent = parent
    parent.title('Tic Tac Toe')


    # Create the restart button widget
    restart_button = tkinter.Button(self.parent, text='RESTART', width=20,
                                    command=self.restart)
    restart_button.pack()
    # Create a canvas widget

    self.canvas = tkinter.Canvas(parent, background='white', width=300,
                                 height=300)

    self.canvas.create_rectangle(0, 0, 300, 300)
    self.canvas.create_rectangle(0, 0, 100, 100)
    self.canvas.create_rectangle(100, 0, 200, 100)
    self.canvas.create_rectangle(200, 0, 300, 100)

    self.canvas.create_rectangle(0, 100, 100, 200)
    self.canvas.create_rectangle(100, 100, 200, 200)
    self.canvas.create_rectangle(200, 100, 300, 200)

    self.canvas.create_rectangle(0, 200, 100, 300)
    self.canvas.create_rectangle(100, 200, 200, 300)
    self.canvas.create_rectangle(200, 200, 300, 300)

    self.canvas.pack()

    self.label = tkinter.Label(self.parent, text="")
    self.label.pack()

    self.game_over = False
    if not self.game_over:
        self.canvas.bind("<Button-1>", self.play)
    self.moves = 0

    **for square in self.canvas.find_all():**
        **self.canvas.itemconfigure(square, fill='white')**
def\uuuuu init\uuuuuuu(自我,父级):
self.parent=parent
父标题(“Tic Tac Toe”)
#创建重启按钮小部件
重新启动按钮=tkinter.button(self.parent,text='restart',width=20,
命令=self.restart)
重新启动按钮。包()
#创建画布小部件
self.canvas=tkinter.canvas(父级,背景为白色,宽度为300,
高度=300)
self.canvas.create_矩形(0,0,300,300)
self.canvas.create_矩形(0,0,100100)
self.canvas.create_矩形(100,0,200,100)
self.canvas.create_矩形(200,0,300,100)
self.canvas.create_矩形(0、100、100、200)
self.canvas.create_矩形(100100200200)
self.canvas.create_矩形(200100300200)
self.canvas.create_矩形(0、200、100、300)
self.canvas.create_矩形(100200200300)
canvas.create_矩形(200200300300)
self.canvas.pack()
self.label=tkinter.label(self.parent,text=”“)
self.label.pack()
self.game\u over=错误
如果不是self.game\u结束:
self.canvas.bind(“,self.play)
self.moves=0
**对于self.canvas.find_all()中的正方形:**
**self.canvas.itemconfigure(square,fill='white')**

注意:复制代码时,不要实际包含
**
。它只是为了强调。如果它不是一个代码块,它将被重新格式化为粗体,但它不能同时格式化为bold
code

,这样做了!谢谢