2013-12-06 10 views
3

Я только что закончил писать графический интерфейс Tkinter для настольной игры Othello для класса программирования. Кажется, что все работает правильно, но что-то странное все еще происходит: любые изменения, которые происходят на графическом интерфейсе игровой панели, обновляются только тогда, когда я нажимаю кнопку за окном.Проблемы с рисованием Tkinter

Это происходит не только в моем приложении, но и в других приложениях GUI, основанных на Tkinter, которые мой инструктор написал - только при работе на моей машине. Я видел, как эти приложения корректно работают на других машинах, что заставило меня поверить, что для моей машины есть что-то конкретное, что вызывает эту проблему, и по этой причине я не включил какой-либо код в свой вопрос.

У кого-нибудь есть понимание этого? Прошу прощения, если я не включил достаточную информацию; Я не совсем уверен, что включить. Я использую 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

Код * может * помочь, поэтому просто отредактируйте и добавьте его в конец. Кроме того, ваши данные о машине/системе (ОС). –

+0

Добавьте к вашему ответу код, показывающий минимальное приложение, которое иллюстрирует проблему, возникающую в вашей системе, но не другие (и расскажите, какая платформа ОС работает в вашей системе). – martineau

+0

вы _sure_ это ваш настоящий код? Существует много синтаксических ошибок. Например '-> None:', 'event: tkinter.Event' и т. Д. –

ответ

1

Если я не ошибаюсь, проблема, которую мы говорим здесь, известная ошибка:

http://bugs.python.org/issue19373


EDIT:

Установка/переустановка ActiveTcl8.5.15.1.297588 за ActiveTcl8.6.1.1.297588 работает! Мой Tkinter GUI снова реагирует.

ПРИМЕЧАНИЕ: Я использую Python 3.3.3.

+0

Спасибо, что сработало. Запуск python в 32-битном режиме также работает как исправление. –

Смежные вопросы