2011-10-07 63 views
3

我有一個簡單的Tkinter程序在Python中可以將腳轉換爲米。它有一個標籤,一個腳輸入框,一個帶有下沉邊框的Meters框,然後是3個按鈕:退出,隱蔽和交換。交換在Tkinter

我只是想弄清楚如何使交換按鈕做到這一點。在窗口中交換英尺和米的位置,這樣您可以輸入x米並將其轉換爲英尺(在轉換後)。

真的,我所需要的只是如何切換位置(數學部分非常簡單),但我無法想象邏輯如何工作。這是我到目前爲止:

import Tkinter 

win = Tkinter.Tk() 
win.title('Converter') 

Row1 =Tkinter.Frame(win) 
blank = Tkinter.Label(Row1, text=' ', font=('Courier New', 30)) 
blank.pack() 
Row1.pack() 

label = Tkinter.Label(win, text='Convert Between Feet and Meters', font=('Courier 
New',30,"bold")) 
label.pack() 

def convert(): 
    st = entry1.get() 
    v = eval(st) 
    if type(v) != type('Hello'): 
     answer.config(text=str(v*.3048)) 

def swap(): 
    #here's where I need to figure out how to swap 


Row2 = Tkinter.Frame(win) 
fLabel = Tkinter.Label(Row2, text='Feet', justify='right', font=('Courier New', 30)) 
entry1 = Tkinter.Entry(Row2, width = 12, font=('Courier New', 30)) 
fLabel.pack(side='left') 
entry1.pack(side='right') 
Row2.pack() 

Row3 = Tkinter.Frame(win) 
mLabel = Tkinter.Label(Row3, text='Meters', justify='right', font=('Courier New',30)) 
answer = Tkinter.Label(Row3, text='0', width=12, relief='sunken', font=('Courier New', 
30)) 
mLabel.pack(side='left') 
answer.pack(side='left') 
Row3.pack() 

Row4 = Tkinter.Frame(win) 
quit = Tkinter.Button(Row4, text='Quit', command = win.destroy, font=('Courier 
New',30)) 
convert = Tkinter.Button(Row4, text='Convert', command = convert, font=('Courier 
New',30)) 
swap = Tkinter.Button(Row4, text='Swap', command=swap, font=('Courier New',30)) 
quit.pack(side='left') 
convert.pack(side='left') 
swap.pack(side='right') 
Row4.pack() 

Row5 = Tkinter.Frame(win) 
blank2 = Tkinter.Label(Row5, text=' ', font=('Courier New', 30)) 
blank2.pack() 
Row5.pack() 

win.mainloop() 

(第一個和最後一個框架只是空間填充)在此先感謝您的幫助!

回答

3

創建一個變量,用於存儲要轉換的變量,並使swap函數更改變量並更新標籤。要更改標籤的文字,您可以執行label['text'] = 'new text'label.configure(text='new text')。這是你的代碼的修改工作:

import Tkinter 

inputmode = 'feet' # This is the variable that stores what you are converting from 


win = Tkinter.Tk() 
win.title('Converter') 

Row1 =Tkinter.Frame(win) 
blank = Tkinter.Label(Row1, text=' ', font=('Courier New', 30)) 
blank.pack() 
Row1.pack() 

label = Tkinter.Label(win, text='Convert Between Feet and Meters', font=('Courier New',30,"bold")) 
label.pack() 

def convert(): 
    st = entry1.get() 
    v = eval(st) 
    if type(v) != type('Hello'): 
     if inputmode == 'feet': # check which way to convert 
      answer.config(text=str(v*.3048)) 
     else: 
      answer.config(text=str(v*3.28)) 

def swap(): 
    global inputmode 
    if inputmode == 'meters': 
     inputmode = 'feet' 
     fLabel['text'] = 'Feet' # Changes the text of the label 
     mLabel['text'] = 'Metres' 
    else: 
     inputmode = 'meters' 
     fLabel['text'] = 'Metres' 
     mLabel['text'] = 'Feet' 


Row2 = Tkinter.Frame(win) 
fLabel = Tkinter.Label(Row2, text='Feet', justify='right', font=('Courier New', 30)) 
entry1 = Tkinter.Entry(Row2, width = 12, font=('Courier New', 30)) 
fLabel.pack(side='left') 
entry1.pack(side='right') 
Row2.pack() 

Row3 = Tkinter.Frame(win) 
mLabel = Tkinter.Label(Row3, text='Meters', justify='right', font=('Courier New',30)) 
answer = Tkinter.Label(Row3, text='0', width=12, relief='sunken', font=('Courier New', 30)) 
mLabel.pack(side='left') 
answer.pack(side='left') 
Row3.pack() 

Row4 = Tkinter.Frame(win) 
quit = Tkinter.Button(Row4, text='Quit', command = win.destroy, font=('Courier New',30)) 
convert = Tkinter.Button(Row4, text='Convert', command = convert, font=('Courier New',30)) 
swap = Tkinter.Button(Row4, text='Swap', command=swap, font=('Courier New',30)) 
quit.pack(side='left') 
convert.pack(side='left') 
swap.pack(side='right') 
Row4.pack() 

Row5 = Tkinter.Frame(win) 
blank2 = Tkinter.Label(Row5, text=' ', font=('Courier New', 30)) 
blank2.pack() 
Row5.pack() 

win.mainloop() 
0

表與標比選擇硬連線成代碼更加擴展。下面使用下標t0和t1來索引標籤表(英尺,米)和轉換因子表(.3048,3.2808)。如果您想創建額外的轉換,例如攝氏到華氏,您可以在不更改代碼的情況下添加到表格中。

其他一些注意事項:

  • 到交換的Python的方式是使用複合賦值(A,B = B,A),而不是一個臨時變量(T = A,A = B, b = T)。
  • 無論何時,同樣的事情會重複多次(比如字體規格 - WOW很大很醜!),可以考慮把它變成一個變量。它更容易更改,更緊湊。
  • 沒有必要爲空格創建空白幀,只需使用填充
  • 網格佈局使英尺/米標籤/值整齊排列。

以下交換函數使用表/標方法:

from Tkinter import Tk, Frame, Label, Entry, Button 

def convert(): 
    global t1 
    st = entry1.get() 
    v = eval(st) 
    if type(v) != type('Hello'): 
     answer.config(text=str(v*factor[t1]), anchor='w') 

def swap(): 
    global t1, t2 
    t1, t2 = t2, t1 
    Label1.config(text=lbl[t1]) 
    Label2.config(text=lbl[t2]) 
    answer.config(text='') 

win = Tk() 
win.title('Converter') 
fspec = ('Courier New', 30) 

label = Label(win, text='Convert Between Feet and Meters', font=fspec+('bold',)) 
label.pack(pady=30) 

Row2 = Frame(win) 
Row2.pack() 
t1, t2 = 0, 1 
lbl = ('Feet', 'Meters') 
factor = (.3048, 1./.3048) 
Label1 = Label(Row2, text=lbl[t1], justify='right', font=fspec) 
entry1 = Entry(Row2, width = 12, font=fspec) 
Label2 = Label(Row2, text=lbl[t2], justify='right', font=fspec) 
answer = Label(Row2, width=12, relief='sunken', font=fspec) 
Label1.grid(row=2, column=2) 
entry1.grid(row=2, column=4) 
Label2.grid(row=4, column=2) 
answer.grid(row=4, column=4) 

Row4 = Frame(win) 
quitb = Button(Row4, text='Quit', command = win.destroy, font=fspec) 
convert = Button(Row4, text='Convert', command = convert, font=fspec) 
swap = Button(Row4, text='Swap', command=swap, font=fspec) 
quitb.pack(side='left') 
convert.pack(side='left') 
swap.pack(side='right') 
Row4.pack(pady=30) 

win.mainloop()