2015-04-07 2 views
2

У меня есть класс Tkinter:Создание класса Tkinter и ждет возвращаемого значения

class DBCreatorWin(): 
    def closeWindow(self): 
     tkMessageBox.showinfo("Ilmiont SQLite Database Manager", "This window cannot be closed.\nEnter a database name and press Continue.") 

    def returnName(self): 
     dbName = self.entry.get() 
     self.window.destroy() 
     return dbName 

    def __init__(self): 
     self.window = Toplevel() 
     self.window.transient(tkRoot) 
     self.window.grab_set() 
     self.window.resizable(width=False, height=False) 
     self.window.title("Ilmiont SQLite Database Manager") 
     self.window.protocol("WM_DELETE_WINDOW", self.closeWindow) 

     self.label = Label(self.window, text="Enter the name of the database to be created: ") 
     self.entry = Entry(self.window, width=30) 
     self.button = Button(self.window, text="Continue", command=self.returnName) 
     self.label.grid(row=0, column=0) 
     self.entry.grid(row=0, column=1) 
     self.button.grid(row=1, column=0, columnspan=2) 

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

Спасибо заранее, Ilmiont

+0

Нормальный поток кода не будет продолжаться после вызова 'mainloop' до тех пор, пока окно не будет закрыто. Если вы хотите, чтобы GUI оставался открытым, вам придется вызывать логику кода из GUI. Без [минимального примера] (http://stackoverflow.com/help/mcve) трудно сказать, что вы сейчас делаете неправильно. – jonrsharpe

+0

Похоже, что вы, возможно, захотите изучить что-то вроде модуля '' easygui' (http://easygui.sourceforge.net/), который не управляется событиями. – martineau

ответ

5

Существует несколько способов сделать это. Основная идея заключается в использовании метода tkinter для ожидания конкретного события перед возвратом. Tkinter предлагает два метода для этого: wait_window и wait_variable. Самый распространенный метод - открыть окно, а затем дождаться его уничтожения. Некоторые хорошие примеры можно найти на сайте effbot на странице под названием Dialog Windows.

Вот простую иллюстрацию. Это не готово к производству, но иллюстрирует общую идею. По крайней мере, вы захотите добавить захват в диалоговом окне, чтобы вы не могли взаимодействовать с основным окном, пока диалог открыт, так как вы сказали, что хотите, чтобы диалог был модальным.

import Tkinter as tk 
class MyDialog(object): 
    def __init__(self, parent): 
     self.toplevel = tk.Toplevel(parent) 
     self.var = tk.StringVar() 
     label = tk.Label(self.toplevel, text="Pick something:") 
     om = tk.OptionMenu(self.toplevel, self.var, "one", "two","three") 
     button = tk.Button(self.toplevel, text="OK", command=self.toplevel.destroy) 
     label.pack(side="top", fill="x") 
     om.pack(side="top", fill="x") 
     button.pack() 

    def show(self): 
     self.toplevel.deiconify() 
     self.toplevel.wait_window() 
     value = self.var.get() 
     return value 


class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 

     self.button = tk.Button(self, text="Click me!", command=self.on_click) 
     self.label = tk.Label(self, width=80) 
     self.label.pack(side="top", fill="x") 
     self.button.pack(pady=20) 

    def on_click(self): 
     result = MyDialog(self).show() 
     self.label.configure(text="your result: %s" % result) 

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

Спасибо за это решение. Это работает хорошо. После некоторой дополнительной охоты, я наткнулся на tkSimpleDialog.askstring, который фактически решает мою проблему очень хорошо. – Ilmiont

-1

Вы не можете.

Весь путь работы tkinter с обратными вызовами. Команда, которую вы используете, является обратным вызовом, и вам нужно будет использовать значение внутри класса. Вот пример:

def do_stuf(self): 
    tkMessageBox.showinfo("Foo", returnName()) 

        .................... 

self.button = Button(self.window, text="Continue", command=self.do_stuff) 
+1

«Вы не можете» неверно. –

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