使用python tkinter进行单元转换程序(创建窗口时出现问题)

时间:2015-03-01 18:30:41

标签: python tkinter

这是我的代码:

from tkinter import *
def ftm(feet):
    return feet*0.305
def mft(meter):
    return round((meters/0.305),3)
def choose():
    if lol=="ft":
        feet = StringVar()
        meters = StringVar()
        rest=Tk()
        f3=Frame(rest)
        f3.grid(column=0, row=0, sticky=(N,W,E,S))
        f3.columnconfigure(0,weight=1)
        f3.rowconfigure(0,weight=1)
        feet_entry = Entry(f3, width=7, textvariable=feet)
        feet_entry.grid(column=2, row=1, sticky=(W, E))
        Label(f3, textvariable=meters).grid(column=2, row=2, sticky=(W, E))
        Button(f3, text="Calculate", command=ftm).grid(column=3, row=3, sticky=W)
        Label(f3, text="feet").grid(column=3, row=1, sticky=W)
        Label(f3, text="is equal to").grid(column=1, row=2, sticky=E)
        Label(f3, text="meters").grid(column=3, row=2, sticky=W)
    elif lol=="m":
        foot = StringVar()
        meter = StringVar()
        pepp=Tk()
        f4=Frame(pepp)
        f4.grid(column=0, row=0, sticky=(N,W,E,S))
        f4.columnconfigure(0,weight=1)
        f4.rowconfigure(0,weight=1)
        meter_entry = Entry(f4, width=7, textvariable=meter)
        meter_entry.grid(column=2, row=1, sticky=(W, E))
        Label(f4, textvariable=foot).grid(column=2, row=2, sticky=(W, E))
        Button(f4, text="Calculate", command=mft).grid(column=3, row=3, sticky=W)
        Label(f4, text="meters").grid(column=3, row=1, sticky=W)
        Label(f4, text="is equal to").grid(column=1, row=2, sticky=E)
        Label(f4, text="feet").grid(column=3, row=2, sticky=W)
    else:
        rino=Tk()
        f5=Frame(rino)
        Label(f5, text="ERROR!").grid(column=1, row=1)


global lol
rip=Tk()
f2=Frame(rip)
f2.grid(column=0, row=0, sticky=(N,W,E,S))
f2.columnconfigure(0,weight=1)
f2.rowconfigure(0,weight=1)
c1=Label(f2, text="feet to meter or meter to feet?")
c1.grid(row=0,column=0)
c2=Label(f2, text="type ft for feet to meter, type m for meter to feet")
c2.grid(row=1,column=0)
lol=StringVar()
choice=Entry(f2,width=4, textvariable=lol)
choice.grid(row=2, column=0)
b1=Button(f2, text="Confirm",command=choose)
b1.grid(row=3,column=0)

我试图首先创建一个选择窗口。然后为不同的选择创建不同的窗口。选择窗口完全没问题,然而,在我点击确认之后,我唯一能得到的就是一个空窗口。我真的不知道如何使用框架创建窗口。我还是python的初学者。 Plz帮助。

1 个答案:

答案 0 :(得分:0)

您的代码存在许多问题,但要回答您提出的问题,空白窗口是因为函数choose()未正确检查lol的值。要获取StringVar窗口小部件的当前值,您需要调用其get()方法 - 因此,如果从以下位置更改第一个:

    if lol=="ft":

    if lol.get()=="ft":

以及以下elif来自:

    elif lol=="m":

    elif lol.get()=="m":

然后,除非您输入无法识别的内容(即不是ftm的内容),否则不会显示空白窗口。要解决此问题,请在else子句中添加下面显示的第二行。

        f5=Frame(rino)
        f5.grid(column=0, row=0, sticky=(N,W,E,S)) # <- need to add this line

<强>更新

以下是您的代码的重新修订版本,我认为这些版本可以解决您在评论中提出的其他问题。它也紧跟在PEP8 Style Guide for Python Code之后,当其他人必须阅读您的代码以帮助您时,这一点尤其重要,因为它通常会澄清正在发生的事情。

from tkinter import *

def ftm(feet):
    return feet * 0.305

def mtf(meters):
    return meters / 0.305

def convert(amount, func, result):
    value = func(float(amount.get()))
    result.set(round((value), 3))

def choose():
    choice = lol.get()
    if choice == "ft":
        feet = StringVar()
        meters = StringVar()
        rest = Toplevel()
        f3 = Frame(rest)
        f3.grid(column=0, row=0, sticky=(N,W,E,S))
        f3.columnconfigure(0, weight=1)
        f3.rowconfigure(0, weight=1)
        feet_entry = Entry(f3, width=7, textvariable=feet)
        feet_entry.grid(column=2, row=1, sticky=(W, E))
        Label(f3, text="feet").grid(column=3, row=1, sticky=W)
        Label(f3, text="is equal to").grid(column=1, row=2, sticky=E)
        Label(f3, textvariable=meters).grid(column=2, row=2, sticky=(W, E))
        Label(f3, text="meters").grid(column=3, row=2, sticky=W)
        Button(f3,
               text="Calculate",
               command=lambda a=feet_entry, f=ftm, r=meters: convert(a, f, r)
              ).grid(column=3, row=3, sticky=W)
    elif choice == "m":
        meters = StringVar()
        feet = StringVar()
        pepp = Toplevel()
        f4 = Frame(pepp)
        f4.grid(column=0, row=0, sticky=(N,W,E,S))
        f4.columnconfigure(0, weight=1)
        f4.rowconfigure(0, weight=1)
        meter_entry = Entry(f4, width=7, textvariable=meters)
        meter_entry.grid(column=2, row=1, sticky=(W, E))
        Label(f4, text="meters").grid(column=3, row=1, sticky=W)
        Label(f4, text="is equal to").grid(column=1, row=2, sticky=E)
        Label(f4, textvariable=feet).grid(column=2, row=2, sticky=(W, E))
        Label(f4, text="feet").grid(column=3, row=2, sticky=W)
        Button(f4,
               text="Calculate",
               command=lambda a=meter_entry, f=mtf, r=feet: convert(a, f, r)
              ).grid(column=3, row=3, sticky=W)
    else:
        rino = Toplevel()
        f5 = Frame(rino)
        f5.grid(column=0, row=0, sticky=(N,W,E,S))
        Label(f5, text="ERROR!").grid(column=1, row=1)

rip = Tk()
f2 = Frame(rip)
f2.grid(column=0, row=0, sticky=(N,W,E,S))
f2.columnconfigure(0, weight=1)
f2.rowconfigure(0, weight=1)
c1=Label(f2, text="feet to meter or meter to feet?")
c1.grid(row=0, column=0)
c2=Label(f2, text='type "ft" for feet to meter, type "m" for meter to feet')
c2.grid(row=1, column=0)
lol = StringVar()
choice=Entry(f2, width=4, textvariable=lol)
choice.grid(row=2, column=0)
b1=Button(f2, text="Confirm", command=choose)
b1.grid(row=3, column=0)

rip.mainloop()