gpt4 book ai didi

python - ttk tkinter 多帧/窗口

转载 作者:太空狗 更新时间:2023-10-30 00:23:44 27 4
gpt4 key购买 nike

我创建的以下应用程序用于在 tkinter 中演示多个窗口。主要问题是没有任何 Entry 控件,无论是在 bmi 计算器还是转换器中,都接受输入框中的值 - 当我这样做时,它们会得到一个 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()

如何解决这个问题,但仍然保持类结构和 python3 的使用?顺便说一句 - 是否与 C# 的 form1.Show() 类似?

最佳答案

您必须将 StringVar() 转换为整数/ float 或使用 IntVar()DoubleVar()

还有其他问题。像下面这样的语句返回“None”,因为它是一个 grid() 对象而不是一个 Label() 对象:

self.label1 = ttk.Label(self, text="Enter your weight:").grid(row=0, column=0, sticky=W)   

我想你也会遇到同时打开两个 Tk() 窗口的问题。请改用 Toplevel() 或单独的框架。

关于python - ttk tkinter 多帧/窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6035101/

27 4 0
文章推荐: python - django 表格 : change attribute of formfield dynamically
文章推荐: c# - 将 Task 转换为 Task,其中 T 未知