2015-04-07 4 views
-1

Я написал небольшое приложение, и я получил его работу с простым графическим интерфейсом в Tkinter, и все очень много работает так, как должно, но я хочу немного добавить полировки.Python - Tkinter - Виджет сообщений не всегда обновляется

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

В частности, у меня есть кнопка в приложении, которая анализирует кучу данных и обычно занимает несколько секунд. Когда пользователь нажимает кнопку, виджет сообщения обновляется до текста «обработка ...», как я этого хочу, но если ранее был добавлен текст в виджет сообщения, когда эта кнопка нажата, новый текст появляется поверх Это. Поскольку текст «обработки» короче, чем предыдущий текст, окно заканчивается показом некоторых из текстовых сообщений до тех пор, пока синтаксический анализ не будет завершен.

Чтобы решить эту проблему, я попытался обновить переменную, чтобы виджет сообщения был пустым, прежде чем менять сообщение на «обработку», но поведение остается неизменным. Я довольно новичок в Tkinter, и документация по обновлению не имеет для меня никакого смысла.

Вот очень упрощенная версия моего кода, я надеюсь, что он перейдет в точку.

import Tkinter as tk 

class Application(tk.Frame): 
    def __init__(self, master=None): 
     tk.Frame.__init__(self, master) 
     self.grid() 
     self.createWidgets() 

    def createWidgets(self): 
     self.text = tk.StringVar() 
     self.text.set("A semi long text string abcdefghijklmnopqrstuvwxyz") 

     text_entry = tk.Entry(self, width = 50) 
     text_entry.grid(row = 0, column = 0, pady = 5, padx = 10) 
     status_msg = tk.Message(self, width = 300, textvariable = self.text) 
     status_msg.grid(row = 2, column = 0, sticky = tk.W, pady = 5) 
     btn_submit = tk.Button(self, text="Test Button", width = 12, command = self.test) 
     btn_submit.grid(row = 1, column = 0, pady = 5, padx = 10) 


    def test(self): 
     self.text.set("") 
     self.master.update_idletasks() 
     self.text.set("Starting to process...") 
     self.master.update_idletasks() 
     for i in range(5000): 
      print i 
     self.text.set("Complete!") 

root = tk.Tk() 
app = Application(master=root) 
app.master.title('Tk test') 
app.master.geometry('400x100') 
app.mainloop() 

EDIT: Для того, чтобы лучше объяснить, что происходит, что я пытаюсь избавиться, вот скриншот виджета сообщения в то время как обработка происходит. Вы можете увидеть «Ключи обработки ...», но после этого вы можете увидеть, где текст предыдущего сообщения все еще существует перед тем, как слово будет действительным (что является частью предыдущего сообщения, и я не хочу вообще быть там message widget screenshot

EDIT2: Я полностью заменил код выше тем, что точно реплицирует проблему, с которой я столкнулся с моей программой (по крайней мере, насколько отображается текст сообщения), что сообщение текст не изменяется до «" (пустой), а скорее сообщение обработки заканчивается поверх предыдущего сообщения, причем некоторые из них отображаются.

Кроме того, изначально у меня была петля до 10000, и я заметил что в этом случае Windows фактически показала окно приложения как не отвечающее пока он не закончит. Я действительно не уверен, что это связано с тем, что у меня есть.

+0

Имеет ли этот код ту же проблему, что и ваш реальный код? Это не кажется возможным из того, что вы описали. То, что вы описали, я ожидаю увидеть, если вы создали виджет сообщения более одного раза, и каждый раз помещал его в одну строку и столбец. –

+1

Советы действительно полезны: http://stackoverflow.com/help/mcve –

+0

Код выше не имеет такой же проблемы, как и мой реальный код, но я предполагаю, что это потому, что ему не хватает нескольких десятков строк циклов и обрабатываемых данных, и без этого при обновлении переменной нет задержки (по крайней мере, это мое предположение о том, что происходит.Я определенно не создал один и тот же виджет (или любой) виджета более одного раза. Проблема с ним, показывающая два разных текстовых сообщения одновременно, возникает только тогда, когда выполняются циклы, обрабатывающие данные. – Prodigal

ответ

0

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

Редактирование первой строки в тестовой функции, которую кнопка вызывает от self.text.set("") до self.text.set(" "), успешно очищает текст сообщения в окне до появления следующего сообщения и, таким образом, удаляет уродливое совпадение во время обработки.

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