【问题标题】:How to print values into a Label in Tkinter如何在 Tkinter 中将值打印到标签中
【发布时间】:2017-03-22 13:58:36
【问题描述】:

我想写一个计算净额和税收的小应用程序。我编写了这段代码,并基于此post 多次尝试使用var.set(),但我不知道如何正确执行。

from tkinter import *
import tkinter as tk

def count23():
    b = gross.get()
    n = round(b/1.23, 2)
    v = round(b - n, 2)
    # print here works, but prints in shell 

def count8():
    b = gross.get()
    n = round(b/1.08, 2)
    v = round(b - n, 2)

def count5():
    b = gross.get()
    n = round(b/1.05, 2)
    v = round(b - n, 2)

root = tk.Tk()

gross = DoubleVar()
root.geometry('220x200+250+250')

L1 = Label(root, text='Input gross ammount').grid(row=0, column=0, columnspan=5)

E1 = Entry(root, textvariable=gross).grid(row=1, column=1, columnspan=3, sticky='WE', padx=5, pady=5)

L2 = Label(root, text='Choose your tax rate').grid(row=2, column=0, columnspan=5)

B1 = Button(root, text='5 %', command=count5)
B1.grid(row=3, column=0, padx=5, pady=5)

B2 = Button(root, text='8 %', command=count8)
B2.grid(row=3, column=2, padx=5, pady=5)

B3 = Button(root, text='23 %', command=count23)
B3.grid(row=3, column=4, padx=5, pady=5)

L3 = Label(root, text=' ').grid(row=4, column=0, columnspan=5)

L4 = Label(root, text='Net').grid(row=5, column=0, columnspan=2, sticky='WE')

L5 = Label(root, text='TAX').grid(row=5, column=3, columnspan=2, sticky='WE')

L6 = Label(root, relief='raised')
L6.grid(row=6, column=0, columnspan=2, sticky='WE')

L7 = Label(root, relief='raised')
L7.grid(row=6, column=3, columnspan=2, sticky='WE')

root.mainloop()

我需要在 L6 和 L7 标签中打印净额和税金。请给我一些线索如何做到这一点。

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    执行此操作的简单方法是为这些标签提供自己的textvariables。

    我用一个函数 show_tax 替换了你的 3 个 count 函数。我们在每个 Button 命令中使用 lambda 函数以所需的税率调用 show_tax。我还做了一些其他的小改动。

    import tkinter as tk
    
    def show_tax(rate):
        b = gross.get()
        n = round(b / rate, 2)
        # Format to string with 2 digits after the decimal point
        net.set(format(n, '.2f'))
        t = round(b - n, 2)
        tax.set(format(t, '.2f'))
    
    root = tk.Tk()
    root.geometry('310x165+250+250')
    root.title('Tax calculator')
    
    gross = tk.DoubleVar()
    net = tk.StringVar()
    tax = tk.StringVar()
    
    tk.Label(root, text='Input gross amount').grid(row=0, column=0, columnspan=5)
    
    e = tk.Entry(root, textvariable=gross)
    e.grid(row=1, column=1, columnspan=3, sticky='WE', padx=5, pady=5)
    
    tk.Label(root, text='Choose your tax rate').grid(row=2, column=0, columnspan=5)
    
    b = tk.Button(root, text='5 %', command=lambda r=1.05: show_tax(r))
    b.grid(row=3, column=0, padx=5, pady=5)
    
    b = tk.Button(root, text='8 %', command=lambda r=1.08: show_tax(r))
    b.grid(row=3, column=2, padx=5, pady=5)
    
    b = tk.Button(root, text='23 %', command=lambda r=1.23: show_tax(r))
    b.grid(row=3, column=4, padx=5, pady=5)
    
    # An empty Label to force row to be displayed
    tk.Label(root).grid(row=4, column=0, columnspan=5)
    
    tk.Label(root, text='Net').grid(row=5, column=0, columnspan=2, sticky='WE')
    tk.Label(root, text='TAX').grid(row=5, column=3, columnspan=2, sticky='WE')
    
    l = tk.Label(root, textvariable=net, relief='raised')
    l.grid(row=6, column=0, columnspan=2, sticky='WE')
    
    l = tk.Label(root, textvariable=tax, relief='raised')
    l.grid(row=6, column=3, columnspan=2, sticky='WE')
    
    root.mainloop()
    

    我在你的代码上还有几个 cmets(以及我对它的更改)。

    使用from tkinter import * 不是一个好主意,因为它将大约 130 个 Tkinter 名称导入到全局命名空间中,这很混乱并且可能导致名称冲突。使用显式的tk. 形式使代码更易于阅读。

    顺便说一句,小部件.grid.pack 方法返回None。所以当你做类似的事情时

    L2 = Label(root, text='Choose your tax rate').grid(row=2, column=0, columnspan=5)
    

    它创建标签,将其放入网格中,然后将L2 设置为None。如果您需要保留对标签的引用,则需要创建小部件并分两步将其放入网格中,如下所示:

    L2 = Label(root, text='Choose your tax rate')
    L2.grid(row=2, column=0, columnspan=5)
    

    如果您不需要需要保留对小部件的引用,但您仍想将其拆分为 2 行以保持行长较短,则只需使用“一次性”变量,例如我有 ebl


    正如 Bryan Oakley 在 cmets 中提到的,我们实际上不需要为这些标签提供自己的 StringVar textvariables:我们可以使用小部件的 .config 方法直接更新它们的 texts。

    import tkinter as tk
    
    def show_tax(rate):
        b = gross.get()
        n = round(b / rate, 2)
        # Format to string with 2 digits after the decimal point
        L6.config(text=format(n, '.2f'))
        t = round(b - n, 2)
        L7.config(text=format(t, '.2f'))
    
    root = tk.Tk()
    root.geometry('310x165+250+250')
    root.title('Tax calculator')
    
    gross = tk.DoubleVar()
    
    tk.Label(root, text='Input gross amount').grid(row=0, column=0, columnspan=5)
    
    e = tk.Entry(root, textvariable=gross)
    e.grid(row=1, column=1, columnspan=3, sticky='WE', padx=5, pady=5)
    
    tk.Label(root, text='Choose your tax rate').grid(row=2, column=0, columnspan=5)
    
    b = tk.Button(root, text='5 %', command=lambda r=1.05: show_tax(r))
    b.grid(row=3, column=0, padx=5, pady=5)
    
    b = tk.Button(root, text='8 %', command=lambda r=1.08: show_tax(r))
    b.grid(row=3, column=2, padx=5, pady=5)
    
    b = tk.Button(root, text='23 %', command=lambda r=1.23: show_tax(r))
    b.grid(row=3, column=4, padx=5, pady=5)
    
    # An empty Label to force row to be displayed
    tk.Label(root).grid(row=4, column=0, columnspan=5)
    
    tk.Label(root, text='Net').grid(row=5, column=0, columnspan=2, sticky='WE')
    tk.Label(root, text='TAX').grid(row=5, column=3, columnspan=2, sticky='WE')
    
    L6 = tk.Label(root, relief='raised')
    L6.grid(row=6, column=0, columnspan=2, sticky='WE')
    
    L7 = tk.Label(root, relief='raised')
    L7.grid(row=6, column=3, columnspan=2, sticky='WE')
    
    root.mainloop()
    

    【讨论】:

    • 非常感谢您的回答。我尝试了 3 种不同的文本变量,但从未想过使用 lambda。它对我来说是新事物。并感谢 cmets。我喜欢有人告诉我我做错了什么
    • “简单的方法是给这些标签自己的文本变量。” - 更简单的方法是不给标签自己的文本变量。您可以直接更新标签,而无需变量对象。更少的对象 == 更少的复杂性。更少的复杂性 == 更易于维护。
    • @BryanOakley:好点。我已经添加了一个新版本。
    • @guest013 很高兴你喜欢它。请查看新的改进版本。
    • @PM2Ring 我必须说这两种解决方案都很好。它们有两个不同的代码行,但它们给了我比以前更好的知识。现在我知道如何以两种方式设置标签 - 简单的方式甚至更简单:) 在我可以处理 .after 方法之后,我将在我的另一个项目中使用 .config ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    相关资源
    最近更新 更多