Python 如何在Tkinter中将值打印到标签中

Python 如何在Tkinter中将值打印到标签中,python,tkinter,Python,Tkinter,我想写一个小应用程序,计算净金额和税收。我编写了这段代码,并在此基础上多次尝试使用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():

我想写一个小应用程序,计算净金额和税收。我编写了这段代码,并在此基础上多次尝试使用
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标签中的净值和税额。请给我一些如何做的线索。

简单的方法是给这些标签自己的
textvariable
s

我将3个
count
函数替换为单个函数
show\u tax
。我们在每个按钮命令中使用lambda函数调用
show\u 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()

我对您的代码(以及我对它的更改)还有一些评论

使用
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)
如果您不需要保留对小部件的引用,但仍然希望将其拆分为两行以保持行长度较短,那么只需使用“一次性”变量,就像我对
e
b
l
所做的那样


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

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()

实现这一点的简单方法是为这些标签提供它们自己的
textvariable
s

我将3个
count
函数替换为单个函数
show\u tax
。我们在每个按钮命令中使用lambda函数调用
show\u 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()

我对您的代码(以及我对它的更改)还有一些评论

使用
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)
如果您不需要保留对小部件的引用,但仍然希望将其拆分为两行以保持行长度较短,那么只需使用“一次性”变量,就像我对
e
b
l
所做的那样


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

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。这对我来说是新事物。谢谢你的评论。我喜欢当有人告诉我我做错了什么时,“简单的方法是给标签自己的文本变量。”-更简单的方法是不给标签自己的文本变量。可以直接更新标签,而不需要变量对象。对象越少=复杂性越低。复杂性更低==更易于维护。@BryanOakley:这是好的观点。我已经添加了一个新版本,可以做到这一点。@guest013我很高兴您喜欢它。请看新的改进版本。@PM2Ring我必须说这两种解决方案都很好。它们有两个不同的代码行,但它们给了我比以前更好的知识。现在我知道了如何用两种方法设置标签——简单的方法和更简单的方法:)我将在处理.after方法之后立即在我的另一个项目中使用.config;)非常感谢你的回答。我试过使用3种不同的文本变量,但从未想过使用lambda。这对我来说是新事物。谢谢你的评论。我喜欢当有人告诉我我做错了什么时,“简单的方法是给标签自己的文本变量。”-更简单的方法是不给标签自己的文本变量。可以直接更新标签,而不需要变量对象。对象越少=复杂性越低。复杂性更低==更易于维护。@BryanOakley:这是好的观点。我已经添加了一个新版本,可以做到这一点。@guest013我很高兴您喜欢它。请看新的改进版本。@PM2Ring我必须说这两种解决方案都很好。它们有两个不同的代码行,但它们给了我比以前更好的知识。现在我知道了如何用两种方法设置标签——简单的方法和更简单的方法:)我将在处理.after方法之后立即在我的另一个项目中使用.config;)