2013-12-05 3 views
2
def createWidgets(self): 
     self.INSTRUCTIONS = Button(self) #creating button linked to instructions_window 
     self.INSTRUCTIONS["text"] = "Instructions" 
     self.INSTRUCTIONS["fg"] = "green" 
     self.INSTRUCTIONS["command"] = self.instruction_window #command which opens instructions_window 

     self.INSTRUCTIONS.pack({"side": "left"}) 

В настоящее время, если я нажимаю кнопку несколько раз, окно инструкций открывается несколько раз. Как обеспечить, чтобы при нажатии кнопки, если окно уже открыто, оно будет мигать, показывая, что одно и то же окно не открывается. Есть команда? Или мне нужно использовать какую-то проверку?Как вы проверяете окно в Tkinter?

+0

, когда вы говорите «окно инструкции» вы говорите о всплывающем окне, или области в текущем окне, которое отображает текст? –

+0

Да, новое всплывающее окно. Кроме того, далее в программу мне нужно будет сделать это для окна для каждого вопроса, а также кнопки «да/нет/вводить» в каждом вопросе, чтобы гарантировать, что функция вызывается только один раз, а не 1 миллион раз - какие-либо предложения? Благодаря – user3056786

ответ

0

Here's a great article dealing with more complicated examples of dialog boxes.

По сути то, что вы ищете почти как modal dialog window, за исключением, кажется, с дополнительной возможностью по-прежнему взаимодействовать с родительским окном в определенной степени. На данный момент, возможно, стоит подумать о том, чтобы сделать его полностью модальным, но я не знаю вашего варианта использования. Если нет, вы можете определенно адаптировать сценарии, указанные на веб-сайте учебника, в соответствии с вашими потребностями.

+0

модальное диалоговое окно «с дополнительной возможностью по-прежнему взаимодействовать с родительским окном» не является модальным диалоговым окном. Само определение модального означает, что вы не можете взаимодействовать с другими окнами. –

+0

Вот почему я сказал почти ... потому что он хочет отключить хотя бы некоторые функции родителя. По крайней мере, для меня это намек на то, что он должен быть полностью модальным (возможно, OP никогда не слышал о них), но я еще раз не знаю конкретного варианта использования. Несмотря на это, он становится таким же простым, как удаление метода 'grab_set()' и заменяет его на метод, чтобы отключить кнопку родительского окна. – ubomb

+0

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

0

Способ, которым я делаю это, - создать функцию, которая создаст окно, если оно не существует, а затем отобразит окно. Лично я не думаю, что нужно зажечь окно, но вы можете сделать это, если хотите. Tkinter не знает, как замаскировать окно, но вы можете сделать что-то простое, как короткое изменение цвета.

Вот пример:

import Tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
     self.instruction_window = None 
     self.instructions = tk.Button(self, text="Instructions", foreground="green", 
             command=self.show_instructions) 
     self.instructions.pack(side="left") 

    def show_instructions(self): 
     '''show the instruction window; create it if it doesn't exist''' 
     if self.instruction_window is None or not self.instruction_window.winfo_exists(): 
      self.instruction_window = InstructionWindow(self) 
     else: 
      self.instruction_window.flash() 

class InstructionWindow(tk.Toplevel): 
    '''A simple instruction window''' 
    def __init__(self, parent): 
     tk.Toplevel.__init__(self, parent) 
     self.text = tk.Text(self, width=40, height=8) 
     self.text.pack(side="top", fill="both", expand=True) 
     self.text.insert("end", "these are the instructions") 

    def flash(self): 
     '''make the window visible, and make it flash temporarily''' 

     # make sure the window is visible, in case it got hidden 
     self.lift() 
     self.deiconify() 

     # blink the colors 
     self.after(100, lambda: self.text.configure(bg="black", fg="white")) 
     self.after(500, lambda: self.text.configure(bg="white", fg="black")) 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(side="top", fill="both", expand=True) 
    root.mainloop() 
+0

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

+0

Брайан: если бы мне нужно было создать больше классов, скажите, что для каждого из моих 10 вопросов мне нужно изменить «def __init __ (self, parent):« для каждого, чтобы избежать конфликтов? Я не уверен в занятиях, поскольку у меня нет опыта их использования. Спасибо – user3056786

+0

@ user3056786: Я не могу ответить на этот вопрос в поле комментариев. Короче говоря, вы, вероятно, создадите один класс и 10 экземпляров, каждый с другим текстом. Но тогда вы не можете использовать код, который я разместил, так как вам нужно изменить текст в зависимости от того, какая кнопка была нажата. Это все возможно, но такого рода вопросы нужно задавать в отдельном вопросе. –

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