Tkinter绘制问题

时间:2013-12-06 04:34:34

标签: python user-interface python-3.x tkinter

我刚刚为编程课程编写了一个基于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()

1 个答案:

答案 0 :(得分:1)

如果我没有弄错的话,我们在这里讨论的问题是一个已知的错误:

http://bugs.python.org/issue19373


修改

ActiveTcl8.5.15.1.297588上安装/重新安装ActiveTcl8.6.1.1.297588正在运行!我的Tkinter GUI再次响应。

注意:我使用的是Python 3.3.3。