12

私の基本プログラムは、スクリプト GUI.py から GUI インターフェイスをインポートします

old_stdout = sys.stdout

root = Tk.Tk()
root.title('Coursera-dl')
root.geometry("345x230")
app = GUI.Interface(root)
app.mainloop()

if app.button_press() == True and app.return_data():
    data = app.return_data()
    main(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8])

sys.stdout = old_stdout

私の GUI.py で:

class Interface(ttk.Frame):
    def __init__(self,parent=None):
        ttk.Frame.__init__(self,parent)
        self.parent = parent
        self.New_Window()

    def New_Window(self):
        self.newWindow = Tk.Toplevel(self.parent)
        self.app = CoreGUI(self.newWindow)


class StdoutRedirector(object):
    def __init__(self,text_widget):
        self.text_space = text_widget

    def write(self,string):
        self.text_space.insert('end', string)
        self.text_space.see('end')


class CoreGUI(object):
    def __init__(self,parent):
        self.parent = parent
        self.InitUI()

    def InitUI(self):
        self.text_box = Tk.Text(self.parent, wrap='word', height = 11, width=50)
        self.text_box.grid(column=0, row=0, columnspan = 2, sticky='NSWE', padx=5, pady=5)
        sys.stdout = StdoutRedirector(self.text_box)

しかし、それは2つのウィンドウを開き、最初のウィンドウ(トップレベルのウィンドウ)は期待どおりに機能し、2番目のウィンドウはアイドル状態です。これは、特定のボタンをクリックするまで予想されることです。 2番目のウィンドウのテキストウィジェットで、これは起こらず、プログラムからの応答がなく、トップレベルウィンドウを閉じるとエラーメッセージが表示されます

"TclError: 無効なコマンド名 "".33328904.33329104"""

では、コンソールではなくテキストウィジェットでデータを印刷するにはどうすればよいですか?


編集:

これに苦労している場合に役立つように、stdout を Tkinter Text ウィジェットにリダイレクトするスクリプトを作成しました。ここで動作を確認してください:-)

4

1 に答える 1

8

問題は、 を呼び出すapp.mainloop()と、スレッドが Tkinter メインループの実行でビジーであるため、ループを終了するまでその前のステートメントが実行されないことです。しかし、メインループを終了すると、Text ウィジェットを使用しようとしますが、既に破棄されています。

mainへの呼び出しをTkinter ウィジェットのコールバックに移動することをお勧めします(すでに でそれを実行しようとしていると思いますapp.button_press())。そうすれば、Text オブジェクトを使用してテキストを表示できます。

class CoreGUI(object):
    def __init__(self,parent):
        self.parent = parent
        self.InitUI()
        button = Button(self.parent, text="Start", command=self.main)
        button.grid(column=0, row=1, columnspan=2)

    def main(self):
        print('whatever')

    def InitUI(self):
        self.text_box = Text(self.parent, wrap='word', height = 11, width=50)
        self.text_box.grid(column=0, row=0, columnspan = 2, sticky='NSWE', padx=5, pady=5)
        sys.stdout = StdoutRedirector(self.text_box)


root = Tk()
gui = CoreGUI(root)
root.mainloop()
于 2013-08-29T17:35:08.740 に答える