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