web-dev-qa-db-ja.com

Tkinterボタンコマンドはプログラムの実行時にアクティブになりますか?

ビルド検索フォームを作成しようとしていますが、ボタンに問題があるようです...私はPython/tkinter GUIプログラミング(および一般的なGUIプログラミング)の初心者で、HelloWorldアプリのスケルトンを借りました。そして、それを基に構築されたソータ。

以下のコードでは、[参照]ボタンの[コマンド]オプションを設定して、クリックされたときにクラスの内部get_dir()関数を呼び出します。ただし、アプリを実行しようとするとすぐにget_dir()関数が呼び出され、ディレクトリを選択するように求められます。これが発生する理由と、それを適切に動作させるために私ができることはありますか?

from Tkinter import *
import tkFont
from tkFileDialog import askdirectory

class App:

    def __init__(self, master):

        fontHead = tkFont.Font(family="Arial", size=10, weight=tkFont.BOLD)
        fontBold = tkFont.Font(family="Arial", size=8, weight=tkFont.BOLD)
        fontReg =  tkFont.Font(family="Arial", size=8)

        frameN = Frame(master)
        frameN.grid(row=0,padx=5,pady=5)

        frameXBH = Frame(frameN)
        frameXBH.grid(row=0,columnspan=5,padx=5)

        Canvas(frameXBH,borderwidth=0,relief="flat",height=1,width=20,background="#cccccc").grid(row=0)
        Label(frameXBH, text="Xbox 360",font=fontBold,width=9).grid(row=0,column=1)
        Canvas(frameXBH,borderwidth=0,relief="flat",height=1,width=440,background="#cccccc").grid(row=0,column=2,sticky="WE")

        Label(frameN, text="Destination Path:",font=fontReg).grid(row=1,sticky="W")
        xbPath = Entry(frameN,width=30,font=fontReg)
        xbPath.grid(row=1,column=1,sticky="W")
        xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir(xbPath))
        xbBrowse.grid(row=1,column=2,sticky="W")
        xbRel = Checkbutton(frameN,text="Release",font=fontReg)
        xbRel.grid(row=1,column=3,sticky="W")
        xbShip = Checkbutton(frameN,text="Ship",font=fontReg)
        xbShip.grid(row=1,column=4,sticky="W")

        Canvas(frameN,borderwidth=1,relief="groove",width=550,height=0).grid(row=2,columnspan=5,pady=10)

        # SAVE AND CANCEL

        btnSave = Button(frameN,text="Save",width=10)
        btnSave.grid(row=3,column=3,sticky="E")

        btnCancel = Button(frameN,text="Cancel",width=10)
        btnCancel.grid(row=3,column=4,sticky="W")

    def get_dir(self,box):
        tmp = askdirectory(mustexist=1,title="Please select a destination")
        tmp = tmp.replace("/","\\")
        box.delete(0,END)
        box.insert(0,tmp)

root = Tk()
root.resizable(0,0)

app = App(root)

root.mainloop()
17
Doktor J

イベントハンドラーをラムダ関数にします。これにより、必要な引数を使用してget_dir()が呼び出されます。

xbBrowse = Button(frameN, text="Browse...", font=fontReg, command=lambda : self.get_dir(xbPath))
28
Kendall

上記のコードでは:

xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir(xbPath))

すでに関数を呼び出しているので、関数を渡すだけです。

xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir)
12
pyfunc

_get_dir_メソッドの参照を渡す必要があります

だから変更

_xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir(xbPath))
_

_xbBrowse = Button(frameN,text="Browse...",font=fontReg, command=self.get_dir)
_

次に、Entryウィジェットをインスタンス変数にして、_get_dir_メソッドでアクセスできるようにします。

例えば.

_self.xbPath = Entry(frameN,width=30,font=fontReg)
_

すると、get_dir()メソッドは次のようになります。

_def get_dir(self):
    tmp = askdirectory(mustexist=1,title="Please select a destination")
    tmp = tmp.replace("/","\\")

    self.xbPath.delete(0,END)
    self.xbPath.insert(0,tmp)
_
6
volting