这是我的代码:
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帮助。
答案 0 :(得分:0)
您的代码存在许多问题,但要回答您提出的问题,空白窗口是因为函数choose()
未正确检查lol
的值。要获取StringVar
窗口小部件的当前值,您需要调用其get()
方法 - 因此,如果从以下位置更改第一个:
if lol=="ft":
到
if lol.get()=="ft":
以及以下elif
来自:
elif lol=="m":
到
elif lol.get()=="m":
然后,除非您输入无法识别的内容(即不是ft
或m
的内容),否则不会显示空白窗口。要解决此问题,请在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()