2016-11-08 39 views
1

我想编写一个计算净额和税额的小应用程序。我写了这段代码,并且基于这个post使用var.set()尝试了很多次,但我不知道它是如何正确的。如何将值打印到Tkinter中的标签

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标签上打印净重和税额。请给我一些线索怎么做。

回答

3

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

我用一个函数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() 

我对你的代码(和我的变化吧)一对夫妇更多的评论。

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

顺便说一下,Widget .grid.pack方法返回None。所以,当你做这样的事情

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

它创建的标签,将其放入格,然后设置L2None。如果你需要一个参考保持在标签您需要在两个步骤来创建控件&其放置到网格,像这样:

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

如果需要保持在一个参考小部件,但是你仍然想要将它分成两行以保持行长度短,然后使用“一次性”变量,就像我用e,bl


正如布莱恩奥克利提到的,我们实际上并不需要给这些标签自己STRINGVAR textvariable S上的意见:我们可以使用Widget的.config方法直接更新自己的text秒。

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

非常感谢您的回答。我曾尝试过3种不同的文本变量,但从未想过使用lambda。它对我来说是新事物。并感谢您的意见。我喜欢当有人告诉我什么即时做错 – guest013

+0

_“简单的方法是给这些标签自己的文本变量。”_ - 更简单的方法是不给标签自己的文本变量。您可以直接更新标签而不需要变量对象。更少的对象==更少的复杂性。复杂性较低==容易维护。 –

+0

@BryanOakley:好点。我已经添加了一个新版本。 –