обмен в Ткинтере - PullRequest
       5

обмен в Ткинтере

3 голосов
/ 07 октября 2011

У меня есть простая программа Tkinter на Python, которая переводит футы в метры. Он имеет метку, поле для ввода ног, поле «Метры» с утопленной границей, а затем 3 кнопки: «Выход», «Скрытый» и «Обмен».

Я просто пытаюсь понять, как заставить кнопку Swap делать именно это. Поменяйте местами футы и метры в окне, чтобы вы могли ввести х метров, и он будет конвертирован в футы (после нажатия кнопки «Преобразовать»).

В самом деле, все, что мне нужно, это как поменять позиции (математическая часть достаточно проста), но я просто не могу думать о том, как логика будет работать для этого. Вот что у меня есть:

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

(первый и последний кадры - просто пробел) Заранее спасибо за любую помощь!

Ответы [ 2 ]

3 голосов
/ 08 октября 2011

Создайте переменную, в которой будет храниться то, из чего вы конвертируете, а функция 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 голосов
/ 09 октября 2011

Таблицы с подписками являются более расширяемыми, чем аппаратные варианты выбора кода.Далее используются индексы t0 и t1 для индексации таблицы меток (футы, метры) и таблицы коэффициентов пересчета (.3048, 3.2808).Если вы хотите создать дополнительные преобразования, например, по Цельсию в Фаренгейты, вы можете добавить в таблицы, не изменяя код.

Несколько других замечаний:

  • Pythonic способswap должен использовать составное присваивание (a, b = b, a), а не временную переменную (t = a, a = b, b = t).
  • Каждый раз, когда одно и то же повторяется много раз (например,как спецификация шрифта - ВАУ, это большой и уродливый!), рассмотрите возможность сделать его переменной.Его легче изменить и сделать более компактным.
  • Нет необходимости создавать пустые рамки для разнесения, просто используйте отступы
  • расположение сетки обеспечивает четкое выравнивание меток / значений футов / метров.

Следующая функция подкачки использует метод таблицы / индекса:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...