2013-11-27 2 views
0

필드에 입력 할 때 Tkinter에서 항목을 만드는 방법이 있습니까? 코드의 수량 섹션에이 기능이 필요합니다.은 Python 2.5의 Entry Tkinter와 관련하여 도움이 필요합니다.

라디오 버튼을 클릭 할 때 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

당신은 custname가 변경되었을 때 changeLabel 전화를 StringVar()에 대한 trace()를 사용할 수 있습니다. Entry 그것이 (수 없음) 빈 때 trace 기능에 몇 가지 인수를 보낼 수 있기 때문에

내가 changeLabel()*args를 추가 int로 변환 값으로 문제가 있었기 때문에

custname.trace("w", changeLabel) 

나는 StringVarIntVar에서 custname을 변경합니다.

전체 코드 : 단지 파이썬에서 테스트

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() 

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_int = int (custname.get())'와'if 2 furas

+0

나는 약간의 수정을 더해 대답 할 예제를 추가했습니다. – furas

관련 문제