[英]ttk tkinter multiple frames/windows
The following application I have created is used to demonstrate multiple windows in tkinter.我创建的以下应用程序用于演示 tkinter 中的多个窗口。 The main problem is that none of the Entry
controls, neither in the bmi-calculator or the converter, accept the values in the entry boxes - they get a ValueError
when I do a calculation.主要问题是,无论是 bmi-calculator 还是转换器,都没有Entry
控件接受输入框中的值 - 当我进行计算时,它们会得到ValueError
。
from tkinter import * from tkinter import ttk from tkinter import messagebox class App1(ttk.Frame): def createWidgets(self): #text variables self.i_height = StringVar() self.i_weight = StringVar() self.o_bmi = StringVar() #labels self.label1 = ttk.Label(self, text="Enter your weight:").grid(row=0, column=0, sticky=W) self.label2 = ttk.Label(self, text="Enter your height:").grid(row=1, column=0, sticky=W) self.label3 = ttk.Label(self, text="Your BMI is:").grid(row=2, column=0, sticky=W) #text boxes self.textbox1 = ttk.Entry(self, textvariable=self.i_weight).grid(row=0, column=1, sticky=E) self.textbox2 = ttk.Entry(self, textvariable=self.i_height).grid(row=1, column=1, sticky=E) self.textbox3 = ttk.Entry(self, textvariable=self.o_bmi).grid(row=2, column=1, sticky=E) #buttons self.button1 = ttk.Button(self, text="Cancel/Quit", command=self.quit).grid(row=3, column=1, sticky=E) self.button1 = ttk.Button(self, text="Ok", command=self.calculateBmi).grid(row=3, column=2, sticky=E) def calculateBmi(self): try: self.weight = float(self.i_weight.get()) self.height = float(self.i_height.get()) self.bmi = self.weight / self.height ** 2.0 self.o_bmi.set(self.bmi) except ValueError: messagebox.showinfo("Error", "You can only use numbers.") finally: self.i_weight.set("") self.i_height.set("") def __init__(self, master=None): ttk.Frame.__init__(self, master) self.grid() self.createWidgets() class App2(ttk.Frame): def create_widgets(self): """Create the widgets for the GUI""" #1 textbox (stringvar) self.entry= StringVar() self.textBox1= ttk.Entry(self, textvariable=self.entry).grid(row=0, column=1) #5 labels (3 static, 1 stringvar) self.displayLabel1 = ttk.Label(self, text="feet").grid(row=0, column=2, sticky=W) self.displayLabel2 = ttk.Label(self, text="is equivalent to:").grid(row=1, column=0) self.result= StringVar() self.displayLabel3 = ttk.Label(self, textvariable=self.result).grid(row=1, column=1) self.displayLabel4 = ttk.Label(self, text="meters").grid(row=1, column=2, sticky=W) #2 buttons self.quitButton = ttk.Button(self, text="Quit", command=self.quit).grid(row=2, column=1, sticky=(S,E)) self.calculateButton = ttk.Button(self, text="Calculate", command=self.convert_feet_to_meters).grid(row=2, column=2, sticky=(S,E)) def convert_feet_to_meters(self): """Converts feet to meters, uses string vars and converts them to floats""" self.measurement = float(self.entry.get()) self.meters = self.measurement * 0.3048 self.result.set(self.meters) def __init__(self, master=None): ttk.Frame.__init__(self, master) self.grid() self.create_widgets() def button1_click(): root = Tk() app = App1(master=root) app.mainloop() def button2_click(): root = Tk() app = App2(master=root) app.mainloop() def main(): window = Tk() button1 = ttk.Button(window, text="bmi calc", command=button1_click).grid(row=0, column=1) button2 = ttk.Button(window, text="feet conv", command=button2_click).grid(row=1, column=1) window.mainloop() if __name__ == '__main__': main()
How can I fix this, but still maintaining the class structure and the use of python3?我该如何解决这个问题,但仍然保持类结构和 python3 的使用? BTW - Anything similar to C#'s form1.Show()
? BTW - 任何类似于 C# 的form1.Show()
?
You have to convert the StringVar()
to an integer/float or use IntVar()
or DoubleVar()
您必须将StringVar()
转换为整数/浮点数或使用IntVar()
或DoubleVar()
There are other problems as well.还有其他问题。 Statements like the following return "None" since it is a grid()
object and not a Label()
object:像下面这样的语句返回“None”,因为它是一个grid()
对象而不是一个Label()
对象:
self.label1 = ttk.Label(self, text="Enter your weight:").grid(row=0, column=0, sticky=W)
I think you will also have problems with two Tk()
windows open at the same time.我认为同时打开两个Tk()
窗口也会出现问题。 Use Toplevel()
or separate frames instead.改用Toplevel()
或单独的帧。
Thanks Joe, you helped quite a bit and I have stumbled onto the answer... using ttk you can use the notebook, and since both my classes are derived frames, I can just add them to the frames of the notebook...谢谢乔,你帮了很多忙,我偶然发现了答案......使用 ttk 你可以使用笔记本,而且由于我的两个类都是派生框架,我可以将它们添加到笔记本的框架中......
def main():
#Setup Tk()
window = Tk()
#Setup the notebook (tabs)
notebook = ttk.Notebook(window)
frame1 = ttk.Frame(notebook)
frame2 = ttk.Frame(notebook)
notebook.add(frame1, text="BMI Calc")
notebook.add(frame2, text="Feet to Meters")
notebook.grid()
#Create tab frames
app1 = App1(master=frame1)
app1.grid()
app2 = App2(master=frame2)
app2.grid()
#Main loop
window.mainloop()
That solves the issues :)这解决了问题:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.