2013-07-29 3 views
0

я использую это, чтобы получить да/нет от пользователя, но он открывает пустое окно:Python: Tkinter askyesno метод открывает пустое окно

from Tkinter import * 
from tkMessageBox import * 
if askyesno('Verify', 'Really quit?'): 
    print "ok" 

И это пустое окно оленьей кожи уйти. Как я могу это предотвратить?

Это не будет работать:

Tk().withdraw() 
    showinfo('OK', 'Select month') 
    print "line 677" 
    root = Tk() 
    root.title("Report month") 
    months = ["Jan","Feb","Mar"] 
    sel_list = [] 
    print "line 682" 

    def get_sel(): 
     sel_list.append(Lb1.curselection()) 
     root.destroy() 

    def cancel(): 
     root.destroy() 

    B = Button(root, text ="OK", command = get_sel) 
    C = Button(root, text ="Cancel", command = cancel) 
    Lb1 = Listbox(root, selectmode=SINGLE) 

    for i,j in enumerate(months): 
     Lb1.insert(i,j) 


    Lb1.pack() 
    B.pack() 
    C.pack() 
    print "line 702" 
    root.mainloop() 

    for i in sel_list[0]: 
     print months[int(i)] 
    return months[int(sel_list[0][0])] 

ответ

1

Создание корневого окна в явном виде, а затем уйти.

from Tkinter import * 
from tkMessageBox import * 
Tk().withdraw() 
askyesno('Verify', 'Really quit?') 

Не красивое решение, но оно работает.


UPDATE

Не создавайте второе окно Tk.

from Tkinter import * 
from tkMessageBox import * 

root = Tk() 
root.withdraw() 
showinfo('OK', 'Please choose') 
root.deiconify() 

# Do not create another Tk window. reuse root. 

root.title("Report month") 
... 
+0

Но после этого диалога я использую другие диалоги, и по какой-то причине ваше решение останавливает мою программу. любая идея почему? – alwbtc

+0

@alwbtc, Не могли бы вы показать код, который остановился? – falsetru

+0

Tk(). Show() showinfo ('OK', 'Please select') root = Tk() root.title ("Отчетный месяц") months = ["Jan", "Feb", "Mar"] def get_sel(): sel_list.append (Lb1.curselection()) root.destroy() защиту отменить(): root.destroy() B = Кнопка (корень, текст = "OK", команда = get_sel) C = Кнопка (корень, текст = "Отмена", команда = отмена) Lb1 = Listbox (корень, selectmode = SINGLE) для I, J в перечислять (месяцы): Lb1.insert (I, J) Lb1.pack() B.pack() C.pack() print "line 702" root.mainloop() return months [int (sel_list [0] [0])] – alwbtc

5

Для того, чтобы создавать любые другие виджеты, окна или диалоги, Tkinter требует наличия корневого окна. Если вы попытаетесь создать диалог перед созданием корневого окна, tkinter автоматически создаст для вас корневое окно.

Решение состоит в том, чтобы явно создать корневое окно, а затем снять его, если вы не хотите, чтобы он был видимым.

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

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