Python 2.7 Tkinter按钮没有';t响应(无鼠标悬停效果)

Python 2.7 Tkinter按钮没有';t响应(无鼠标悬停效果),python-2.7,button,tkinter,twisted,exit,Python 2.7,Button,Tkinter,Twisted,Exit,我正在写一个游戏,它包含从客户端到服务器以及从服务器到客户端的信息。一个特定的(非玩)客户端是监视器,它只显示游戏板和玩家。这很好,唯一不起作用的是GUI上的退出按钮。一件小事,但我希望它能起作用。:)另外,我认为代码可能有一些相当大的错误,即使它可以工作 我尝试了各种不同的命令(sys.exit,quit…),但都没有解决 没有错误消息,按钮完全没有任何变化。没有鼠标悬停的效果,如果我点击它什么都没有。相关代码(我删除了矩阵和服务器逻辑,因为我认为它不相关——如果不是,我会发布): 首先,类代

我正在写一个游戏,它包含从客户端到服务器以及从服务器到客户端的信息。一个特定的(非玩)客户端是监视器,它只显示游戏板和玩家。这很好,唯一不起作用的是GUI上的退出按钮。一件小事,但我希望它能起作用。:)另外,我认为代码可能有一些相当大的错误,即使它可以工作

我尝试了各种不同的命令(sys.exit,quit…),但都没有解决

没有错误消息,按钮完全没有任何变化。没有鼠标悬停的效果,如果我点击它什么都没有。相关代码(我删除了矩阵和服务器逻辑,因为我认为它不相关——如果不是,我会发布):


首先,类代理没有缩进,其次是退出按钮的“回调”
self.frame.destroy从来没有定义过,所以它什么都不做。如果您想使用tkinter destroy方法,请尝试self.frame.destroy()或显式定义它。您还可以尝试调用
fram.pack\u-forget()
fram.grid\u-forget()


根据整行代码将master.mainloop()添加到最后一行

您似乎没有在任何地方调用
mainloop
。是真的,还是你把密码漏掉了?不,我不是。。。我只是在谷歌上搜索了一下,很明显,即使没有它,你也必须调用mainloop:)我只是尝试了一些对我来说似乎合乎逻辑的变体,但我不知道在哪里调用mainloop,在什么情况下调用mainloop。它是在master上,因为它是Tk()实例还是在main上?我应该在哪里调用它?通常,您将在根窗口上调用
mainloop
,作为程序中的最后一行代码。按钮通过响应事件来工作。如果不运行事件循环,则无法发送或接收事件
mainloop
是事件循环。我只是不确定代码的最后一行在哪里。我在类代理中添加了一些代码来显示我的问题。当从服务器接收到新数据时,将绘制游戏板。我想我不能/不应该在那里调用mainloop。我尝试了类代理的最后一行,或者类Main的最后一行,两者都产生了一个空的tk窗口?如果我把它作为Agent()中的最后一行,我会得到一个空tk窗口。谢谢你的回答,但是如果我这样做,我会再次得到一个空tk窗口。我添加它作为类代理中的最后一行,因为只有master是一个已知变量。它是在代理中实例化的,所以我不能在类之外处理它。我想你是说别的地方?
class Main():
def __init__(self, master):
    self.frame = Frame(master)
    self.frame.pack()
    # Has to be counted up by server class
    rounds = 0
    # Has to be communicated by server class. If numberwin == numberrobots,
    # game is won
    numberwin = 0
    numberrobots = 2

def draw(self):
    if hasattr(self, 'info'):
        self.info.destroy()
    if hasattr(self, 'quit'):
        self.quit.destroy()
    print "Main should draw this matrix %s" % self.matrix

    [...] lots of matrix stuff [...]

    # Pop-Up if game was won
    # TODO: Make GUI quittable
    if self.numberwin == self.numberrobots:
        self.top = Toplevel()
        self.msg = Message(self.top, text="This game was won!")
        self.msg.pack(side=LEFT)
        self.quittop = Button(
            self.top, text="Yay", command=self.frame.destroy)
        self.quittop.pack(side=BOTTOM)

    # TODO: Quit GUI
    self.quit = Button(self.frame, text="Quit", command=self.frame.destroy)
    self.quit.pack(side=BOTTOM)

    # Information on the game
    self.info = Label(
        self.frame, text="Rounds played: {}, Numbers of robots in win condition: {}".format(self.rounds, self.numberwin))
    self.info.pack(side=TOP)


def canvasCreator(self, numberrows, numbercolumns):
     # Game board
    self.canvas = Canvas(
        self.frame, width=numbercolumns * 100 + 10, height=numberrows * 100 + 10)
    self.canvas.pack()


class Agent(Protocol, basic.LineReceiver):
master = Tk()
main = Main(master)
# So first matrix is treated differently from later matrixes
flagFirstMatrix = 1

def connectionMade(self):
    msg = dumps({"type": "monitor"})
    self.sendLine(msg)
    print "Sent message:", msg

def dataReceived(self, data):
    # Decode the json dump
    print "Data received: %s" % data
    data = loads(data)
    self.main.matrix = np.matrix(data["positions"])
    self.main.goals = np.matrix(data["goals"])
    self.main.next_move_by_agent = data["next_move"]
    self.main.rounds = data["rounds"]
    self.main.numberwin = data["win_states"]
    if self.flagFirstMatrix == 1:
        self.main.numberrows, self.main.numbercolumns = self.main.matrix.shape
        self.main.canvasCreator(
            self.main.numberrows, self.main.numbercolumns)
        self.main.canvas.pack()
        self.flagFirstMatrix = 0
    self.main.canvas.delete(ALL)
    self.main.draw()
    self.master.update_idletasks()
    self.master.update()