2014-01-13 8 views
0

Я создаю небольшой инструмент управления временем, используя Tkinter, поэтому я могу продолжать работу на работе. У меня возникают проблемы с одним аспектом, и я не могу работать. Я использую окно с ошибкой, чтобы оно отображалось перед всеми другими окнами.Как я могу создать несколько tkMessageBox.showerror одновременно?

Как и сейчас, программа запускает новый поток функции, которая отслеживает время и сравнивает ее с временем, введенным пользователем для выполнения своей задачи. После реального времени> времени, введенного пользователем, он запускает другой поток, чтобы вызвать tkMessageBox. Я пробовал это, не создавая новый поток, чтобы вызвать tkMessageBox, и проблема такая же. Если пользователь вводит одно и то же время для двух отдельных задач, ошибка всплывает. У меня возникли проблемы с поиском информации по этой теме ... Поведение странно, потому что, если у меня есть 2 предупреждения, скажем 1 на 0600 и один на 0601, но я не закрываю первое окно ошибки, которое появляется и позволяет оставайтесь до тех пор, пока не начнется второе срабатывание предупреждения, второе предупреждение просто заменит первое (я бы хотел, чтобы по возможности появлялось несколько ящиков ошибок). Это только предупреждения, которые имеют одинаковое время запуска, которые заставляют всплывающее окно замирать.

Это моя первая программа графического интерфейса и только начал изучать концепцию потоковой передачи и графические интерфейсы за последние 24 часа, поэтому я не уверен, что это проблема с потоками или tkMessageBox. Из-за поведения окна ошибки я думаю, что это потоковый модуль в сочетании с модулем tkMessageBox. Команда, я использую это:

tkMessageBox.showerror('TIMER ALERT!!!', comp_msg) 

Here is the source я ставлю комментарии в там, чтобы помочь. TkMessageBox, о котором я говорю, это строка 56.

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

Заранее спасибо, и я действительно ценю любую помощь.

EDIT:

import thread 
from Tkinter import * 

#Spawns Error Box. Runs in it's own thread. 
def message_box(comp_msg,q):  # q is an empty string because of thread module. 
    print "Spawning Error Box..." 
    eb =Toplevel() 
    eb.config(master=None,bg="red") 
    pop_l = Label(eb,text="ALERT!!!") 
    pop_l2=Label(eb,text=comp_msg) 
    pop_l.pack(pady=10,padx=10) 
    pop_l2.pack(pady=15,padx=10) 
    return eb 

thread.start_new_thread(message_box,(comp_msg,"")) 

ответ

1

диалоговые tkmessageBox по умолчанию коробки modal. Для этого приложения вы можете реализовать простое немодальное диалоговое окно. Here - хороший документ о создании пользовательских диалоговых окон.

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

Это простое приложение Tkinter, которое показывает часы в главном окне. Когда вы нажимаете на кнопку, она запускает новые диалоговые окна tkMessageBox в новых потоках. (Если вы его запустили), вы можете видеть, что основной поток, который запускает цикл событий TK, работает (поскольку время обновляется), но ошибки не отображаются, как ожидалось.

#!/usr/bin/env python 

import datetime 
import threading                                                                
from Tkinter import * 
import tkMessageBox 

class MyApp(Frame): 
    def __init__(self, root=None): 
     if not root: 
      root = Tk() 
     self.time_var = StringVar() 
     self.time_var.set('starting timer ...') 

     self.root = root 
     Frame.__init__(self, root) 
     self.init_widgets() 
     self.update_time() 

    def init_widgets(self): 
     self.label = Label(self.root, textvariable=self.time_var) 
     self.label.pack() 
     self.btn = Button(self.root, text='show error', command=self.spawn_errors) 
     self.btn.pack() 

    def update_time(self): 
     self.time_var.set(str(datetime.datetime.now())) 
     self.root.after(1000, self.update_time) 

    def spawn_errors(self): 
     for i in range(3): 
      t = threading.Thread(target=self.show_error) 
      t.start() 

    def show_error(self): 
     now = datetime.datetime.now() 
     tkMessageBox.showerror('Error: %s' % (str(now)), now) 


if __name__ == '__main__': 
    app = MyApp() 
    app.mainloop() 
+0

Thank you farzad! Когда речь заходит о программировании, я больше занимаюсь хобби, поэтому, когда классы участвуют в Tkinter, это идет мне на голову. Я все равно смотрю на это, чтобы посмотреть, смогу ли я это понять. Мне просто нелегко проводить занятия, так как мне никогда не приходилось их использовать. Еще раз спасибо! – DuckPuncher

+0

Добро пожаловать. Я добавил пример кода, чтобы вы могли использовать его в качестве базы для своего приложения. – farzad

+0

Не запутайтесь в классах. Вы сделали самую трудную вещь, которая делает первый шаг, фактически начиная кодирование. Вы можете легко узнать обо всем этом, и Python - это понятный приятный язык для изучения/программирования. И когда у вас есть вопросы, вы уже знаете, где спросить.;) – farzad

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