2013-11-27 34 views
0

當你在字段中鍵入時,是否有辦法讓Tkinter中的條目有反應?我想要這個功能的代碼的數量部分。在Python 2.5中需要Entry Tkinter的幫助

單擊單選按鈕時會自動生成label4text,但在輸入數量時不會自動生成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() 

回答

2

可以使用trace()StringVar()調用changeLabelcustname改變。

custname.trace("w", changeLabel) 

我改變custnameIntVarStringVar因爲Entry有問題,轉換價值爲int時,它是空的(無編號)

我添加*argschangeLabel()因爲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("-") 
+0

修復了一個問題,但我需要使用一個範圍來確定子網掩碼。例如 如果custname.get()<=「6」和custname.get()> 2: label4Text.set(「255.255.255.248」) 它似乎沒有讓我使用範圍... –

+0

' (custname.get())'和 furas

+0

我添加了一個例子來回答 - 只有更少的修改。 – furas