我刚刚为编程课程编写了一个基于Tkinter的棋盘游戏Othello GUI。一切似乎都正常工作,但仍然发生一些奇怪的事情:只有当我在窗口外面点击时,游戏板GUI上发生的任何更改都会更新。
这不仅发生在我的应用程序中,而且发生在我的教师编写的其他基于Tkinter的GUI应用程序中 - 仅在我的机器上运行时。我已经看到这些应用程序在其他机器上正常工作,这让我相信我的机器特有的东西导致了这个问题,因此,我还没有包含任何内容。代码在我的问题中。
有没有人对此有任何见解?如果我没有包含足够的细节,我很抱歉;我不确定要包括什么。我使用的是Python 3.3.2和Tkinter 8.5
编辑:
这是我的教师编写的GUI代码。它是一个简单的应用程序,可以在用户单击的任何位置在画布上创建椭圆。它在学校的机器上运行良好,但在我的计算机上,当我点击画布时,在我点击tkinter窗口之外没有任何反应。点击窗口外部后,斑点绘制正确。
另外,我正在运行OS X Mavericks(10.9)。
import coordinate
import spots_engine
import tkinter
class SpotsApplication:
def __init__(self, state: spots_engine.SpotsState):
self._state = state
self._root_window = tkinter.Tk()
self._canvas = tkinter.Canvas(
master = self._root_window, width = 500, height = 450,
background = '#006000')
self._canvas.grid(
row = 0, column = 0, padx = 10, pady = 10,
sticky = tkinter.N + tkinter.S + tkinter.E + tkinter.W)
self._canvas.bind('<Configure>', self._on_canvas_resized)
self._canvas.bind('<Button-1>', self._on_canvas_clicked)
self._root_window.rowconfigure(0, weight = 1)
self._root_window.columnconfigure(0, weight = 1)
def start(self) -> None:
self._root_window.mainloop()
def _on_canvas_resized(self, event: tkinter.Event) -> None:
self._redraw_all_spots()
def _on_canvas_clicked(self, event: tkinter.Event) -> None:
width = self._canvas.winfo_width()
height = self._canvas.winfo_height()
click_coordinate = coordinate.from_absolute(
(event.x, event.y), (width, height))
self._state.handle_click(click_coordinate)
self._redraw_all_spots()
def _redraw_all_spots(self) -> None:
self._canvas.delete(tkinter.ALL)
canvas_width = self._canvas.winfo_width()
canvas_height = self._canvas.winfo_height()
for spot in self._state.all_spots():
center_x, center_y = spot.center_coordinate().absolute(
(canvas_width, canvas_height))
radius_x = spot.radius_frac() * canvas_width
radius_y = spot.radius_frac() * canvas_height
self._canvas.create_oval(
center_x - radius_x, center_y - radius_y,
center_x + radius_x, center_y + radius_y,
fill = '#ffff00', outline = '#000000')
if __name__ == '__main__':
SpotsApplication(spots_engine.SpotsState()).start()
答案 0 :(得分:1)
如果我没有弄错的话,我们在这里讨论的问题是一个已知的错误:
http://bugs.python.org/issue19373
修改强> 的
在ActiveTcl8.5.15.1.297588
上安装/重新安装ActiveTcl8.6.1.1.297588
正在运行!我的Tkinter GUI再次响应。
注意:我使用的是Python 3.3.3。