使用 python tkinter 的单位转换程序(创建 windows 时出现问题)

unit converting program using python tkinter (trouble with creating windows)

这是我的代码:

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)

我正在尝试先创建一个选择 window。然后为不同的选择创建不同的windows。选择 window 完全没问题,但是,在我点击确认后,我唯一能得到的是一个空的 window。我真的不知道如何使用框架创建 window。我还是 python 的初学者。请帮助。

您的代码有很多问题,但为了回答您提出的问题,空白 window 是因为函数 choose() 没有正确检查 lol 的值。要获取 StringVar 小部件的当前值,您需要调用它的 get() 方法——因此将第一个 if 从:

更改为
    if lol=="ft":

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

和以下 elif 来自:

    elif lol=="m":

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

然后将不会显示空白 window,除非您输入无法识别的内容(即不是 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()