ttk tkinter 多个框架/窗口 [英] ttk tkinter multiple frames/windows

查看:41
本文介绍了ttk tkinter 多个框架/窗口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建的以下应用程序用于演示 tkinter 中的多个窗口.主要问题是,无论是在 bmi 计算器还是转换器中,都没有 Entry 控件接受输入框中的值 - 当我这样做时,它们会收到 ValueError一个计算.

<前>从 tkinter 导入 *从 tkinter 导入 ttk从 tkinter 导入消息框类 App1(ttk.Frame):def createWidgets(self):#文本变量self.i_height = StringVar()self.i_weight = StringVar()self.o_bmi = StringVar()#标签self.label1 = ttk.Label(self, text="输入你的体重:").grid(row=0, column=0,sticky=W)self.label2 = ttk.Label(self, text="输入你的身高:").grid(row=1, column=0,sticky=W)self.label3 = ttk.Label(self, text="你的BMI是:").grid(row=2, column=0,sticky=W)#文本框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)#纽扣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)定义计算Bmi(自我):尝试:self.weight = float(self.i_weight.get())self.height = float(self.i_height.get())self.bmi = self.weight/self.height ** 2.0self.o_bmi.set(self.bmi)除了值错误:messagebox.showinfo("错误", "您只能使用数字.")最后:self.i_weight.set("")self.i_height.set("")def __init__(self, master=None):ttk.Frame.__init__(self, master)self.grid()self.createWidgets()类 App2(ttk.Frame):def create_widgets(self):"""为 GUI 创建小部件"""#1 文本框 (stringvar)self.entry= StringVar()self.textBox1= ttk.Entry(self, textvariable=self.entry).grid(row=0, column=1)#5 标签(3 个静态,1 个字符串变量)self.displayLabel1 = ttk.Label(self, text="feet").grid(row=0, column=2,sticky=W)self.displayLabel2 = ttk.Label(self, text="相当于:").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 按钮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):"""将英尺转换为米,使用字符串变量并将它们转换为浮点数"""self.measurement = float(self.entry.get())self.meters = self.measurement * 0.3048self.result.set(self.meters)def __init__(self, master=None):ttk.Frame.__init__(self, master)self.grid()self.create_widgets()def button1_click():根 = Tk()app = App1(master=root)app.mainloop()def button2_click():根 = Tk()app = App2(master=root)app.mainloop()定义主():窗口 = 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()如果 __name__ == '__main__':主要的()

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

解决方案

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

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

self.label1 = ttk.Label(self, text="输入你的体重:").grid(row=0, column=0,sticky=W)

我认为您也会遇到同时打开两个 Tk() 窗口的问题.改用 Toplevel() 或单独的帧.

The following application I have created is used to demonstrate multiple windows in 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.

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? BTW - Anything similar to C#'s form1.Show()?

解决方案

You have to convert the StringVar() to an integer/float or use IntVar() or DoubleVar()

There are other problems as well. Statements like the following return "None" since it is a grid() object and not a Label() object:

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. Use Toplevel() or separate frames instead.

这篇关于ttk tkinter 多个框架/窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆