0

これは信じられないほど簡単にできるはずですが、苦労しています。プログラミングは私の主なバックグラウンドではないので、多くの基礎が欠けていますが、学ぼうとしています。

私が扱っている問題は、Tkinter ボタンを使用してボタンのリスト (現在は 1 つだけ) を表示したいということです。これらのボタンの 1 つが押されると、そのボタンからのテキストが文字列変数に入力され、ボタン ウィンドウを開き、コードを続行します。

このセクションの内容は次のとおりです。

    root = tk.Tk()

    def data(name):
       global query 
       query = name


    B = tk.Button(root, text ='LogID', command = data('LogID'))

    B.pack()
    root.mainloop()

    print query

これがおそらく少しごちゃごちゃした、またはドタバタしているように見える場合、それはそうであるからです.

このセクションの前と後のコードがあります。ボタンが押されたときにウィンドウを閉じて(root.destroy())、コードが「クエリ」からテキストを出力するようにしたいので、値が渡されたことがわかります。

実行すると、root.mainloop() セクションでハングするか、ハングするようです。正直に言うと、それがコードで何をするのか完全には理解していません。

4

1 に答える 1

2

すでにグローバル変数を使用していることが わかったので、アプリケーションをTkinter.Tk(Python 3ではtkinter.Tk)のサブクラスにする方法
の例を使用して質問に答えます。

import Tkinter as tk

class Application(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.title('Hello world!')
        self.data = None

        self.helloButton = tk.Button(self, width=12, text='Hello',
                    command=lambda x='hi': self.say_hi(x))
        self.helloButton.grid(row=0, column=1, padx=8, pady=8)

    def say_hi(self, x):
        self.data = x
        self.withdraw()
        self.secondWin = tk.Toplevel(self)
        self.secondWin.grid()
        self.output = tk.Entry(self.secondWin)
        self.output.insert(0, x)
        self.output.grid()
        self.quitButton = tk.Button(self.secondWin, text='Quit', bg='tan',
                                    command=self.close_app)
        self.quitButton.grid()

    def close_app(self):
        self.destroy()

app = Application()
app.mainloop()

変数self.dataは、クラスのどのメソッドでも使用できます。
したがって、globalキーワードを使用する必要はありません。
mainloop、tkinterアプリケーションを「実行中」に保ち、イベントを処理します。
最初のウィンドウを破棄しなかったが、withdrawメソッドを使用して非表示にしたことに注意してください。
これは、興味があるかもしれないもう1つのオプションです。これを使用deiconifyして表示することができます(詳細はこちら)。2番目のウィンドウはトップレベルウィジェットであり、これを使用してセカンダリウィンドウを作成します。

私はここで見つけることができるより教育的な例を書きました。

于 2012-07-06T04:27:25.370 に答える