0

フィールドに入力したときに Tkinter のエントリを反応させる方法はありますか? コードの Quantity セクションにこの機能が必要です。

ラジオボタンをクリックするとlabel4textが自動生成されますが、数量を入力すると生成されません。

from Tkinter import *

SubnetM = 0

def beenclicked():
    radioValue = relStatus.get()
    return

def changeLabel():
    if relStatus.get() == 'HOSTS':
        if custname.get() == 6:
            label4Text.set("255.255.255.248")
            return
    if relStatus.get() == 'NETWORKS':
        if custname.get() == 6:
            label4Text.set("224.0.0.0")
            return

app = Tk()
app.title("SUBNET MASK CALCULATOR")
app.geometry('400x450+200+200')

labelText = StringVar()
labelText.set("WELCOME!")
label1 = Label(app,textvariable=labelText, height=4)
label1.pack()

relStatus = StringVar()
relStatus.set(None)
radioValue = relStatus.get()
radio1 = Radiobutton(app, text="HOSTS", value="HOSTS", variable=relStatus, command=changeLabel)
radio1.pack()
radio1 = Radiobutton(app, text="NETWORKS", value="NETWORKS", variable=relStatus, command=changeLabel)
radio1.pack()

label2Text = StringVar()
label2Text.set("~Quantity~")
label2 = Label(app, textvariable=label2Text, height=4)
label2.pack()

custname = IntVar(None)
Quantity = Entry(app, textvariable=custname,)
Quantity.pack()

label3Text = StringVar()
label3Text.set("Your Subnet Mask is...")
label3 = Label(app, textvariable=label3Text, height=4)
label3.pack()

label4Text = StringVar()
label4Text.set(SubnetM)
label4 = Label(app, textvariable=label4Text, height=4)
label4.pack()

button1 = Button(app, text="GO!", width=20, command=changeLabel)
button1.pack(padx=15, pady=15)

app.mainloop()
4

1 に答える 1

2

trace()forを使用して、変更されたときにStringVar()呼び出すことができます。changeLabelcustname

custname.trace("w", changeLabel)

空(数値なし)のときに値をintに変換する際に問題があったためcustname、からIntVarに変更しましたStringVarEntry

関数にいくつかの引数を送信するため、追加*argsします。changeLabel()trace

完全なコード:

from Tkinter import *

SubnetM = 0

def beenclicked():
    radioValue = relStatus.get()
    return

def changeLabel(*args): # require *args for trace
    print "changeLabel", args
    if relStatus.get() == 'HOSTS':
        if custname.get() == "6":
            label4Text.set("255.255.255.248")
            return
    if relStatus.get() == 'NETWORKS':
        if custname.get() == "6":
            label4Text.set("224.0.0.0")
            return

app = Tk()
app.title("SUBNET MASK CALCULATOR")
app.geometry('400x450+200+200')

labelText = StringVar()
labelText.set("WELCOME!")
label1 = Label(app,textvariable=labelText, height=4)
label1.pack()

relStatus = StringVar()
relStatus.set(None)
radioValue = relStatus.get()
radio1 = Radiobutton(app, text="HOSTS", value="HOSTS", variable=relStatus, command=changeLabel)
radio1.pack()
radio1 = Radiobutton(app, text="NETWORKS", value="NETWORKS", variable=relStatus, command=changeLabel)
radio1.pack()

label2Text = StringVar()
label2Text.set("~Quantity~")
label2 = Label(app, textvariable=label2Text, height=4)
label2.pack()

custname = StringVar()
custname.set("0")
Quantity = Entry(app, textvariable=custname,)
Quantity.pack()
custname.trace("w", changeLabel)


label3Text = StringVar()
label3Text.set("Your Subnet Mask is...")
label3 = Label(app, textvariable=label3Text, height=4)
label3.pack()

label4Text = StringVar()
label4Text.set(SubnetM)
label4 = Label(app, textvariable=label4Text, height=4)
label4.pack()

button1 = Button(app, text="GO!", width=20, command=changeLabel)
button1.pack(padx=15, pady=15)

app.mainloop()

Python 2.7 でのみテスト済み

編集:

さらにいくつかの変更を加えました:

def changeLabel(*args): # require *args for trace
    print "changeLabel", args

    custname_int = 0 # default value when error
    try:
        custname_int = int( custname.get() )
    except:
        pass # if error do nothing

    if 2 < custname_int <= 6:
        if relStatus.get() == 'HOSTS':
            label4Text.set("255.255.255.248")
        else: #if relStatus.get() == 'NETWORKS':
            label4Text.set("224.0.0.0")
    else:
        label4Text.set("-")

編集:

この方法では、(ほとんど) 数字のみを に書き込むことができますQuantity。最後の文字が数字でない場合は「食べます」が、数字間の間違った文字を削除することはできません。

def changeLabel(*args): # require *args for trace
    #print "changeLabel", args

    custname_str = custname.get() 
    custname_int = 0 # default value when error

    try:
        custname_int = int( custname_str )
    except:
        if custname_str != "": # if not empty
            custname.set(custname_str[:-1]) # remove last char
            return 

    if 2 < custname_int <= 6:
        if relStatus.get() == 'HOSTS':
            label4Text.set("255.255.255.248")
        else: #if relStatus.get() == 'NETWORKS':
            label4Text.set("224.0.0.0")
    else:
        label4Text.set("-")
于 2013-11-27T04:50:08.250 に答える