尝试在tkinter标签/条目小部件中将字符串添加到float变量

时间:2015-11-28 09:32:14

标签: tkinter osx-lion python-3.4

我希望得到一些关于我花费太多时间试图解决的问题的指导。每当我找到解决方案时,另一个问题就会取而代之。

我的目标是“简单地”对某些数字做一些基本数学,然后在浮点变量的开头添加一个'$'。

起初我试过这个:

self.paid_main.set("$", self.paid_entry.get())

错误:

TypeError: set() takes 2 positional arguments but 3 were given

我显然在这里遗漏了一些东西,因为我认为我给了2个参数 - “$”和self.paid_entry.get()

然后我尝试了:

paid = ("$", self.paid_entry.get())
self.paid_main.set(paid)

这可行,但在GUI上给出了可怕的结果。它不是在那里放置一个美元符号,而是在它周围放置花括号。例如{$}

然而乞丐不能选择,所以我坚持使用可怕的花括号选项,直到我再遇到这个问题。

total_main = ("$", "%.2f" % self.quantity_entry.get() *   self.paid_entry.get() + self.brokerage_entry.get())
self.total_main.set(total_main)

错误:

TypeError: can't multiply sequence by non-int of type 'float'

同样,我必须遗漏一些东西,因为你什么时候不能乘以浮动?

如果我选择不在任何事情面前添加美元符号,我可以解决所有问题,但之后我会以第二好的方式解决问题。我希望有人可以帮助我解决以下问题:

  1. 3个位置参数是什么,因为我只计算2个?
  2. 有没有办法提供另一个参数?
  3. 有没有办法添加没有花括号的美元符号?
  4. 为什么我在尝试乘以浮点时遇到错误?
  5. 我应该注意,我必须将IntVar和DoubleVar变量设置为空字符串,因为在我点击“添加”之前,它将分别将0和0.0分别添加到标签坐标。除非有另一种方法可以避免这种情况吗?

    提前感谢任何可以帮助我的人。

    以下完整代码:

    #!/usr/bin/env python3.4
    
    from tkinter import *
    import ystockquote
    import urllib.request
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    import decimal
    
    class Shares(Frame):
    
        def __init__(self, master):
        Frame.__init__(self, master)
        Frame(self ,width = 500, height = 300)
        self.configure()
        self.grid()
    
        Label(self, font = "Helvetica 14 bold", text = "      Name    ").grid(row = 8, column = 1, columnspan = 2, sticky = W, padx = 5, pady = 5)
        Label(self, font = "Helvetica 14 bold", text = "      Code    ").grid(row = 8, column = 3, padx = 5, pady = 5)
        Label(self, font = "Helvetica 14 bold", text = "    Buy Date  ").grid(row = 8, column = 4, padx = 5, pady = 5)
        Label(self, font = "Helvetica 14 bold", text = "    Quantity  ").grid(row = 8, column = 5, padx = 5, pady = 5)
        Label(self, font = "Helvetica 14 bold", text = "      Paid    ").grid(row = 8, column = 6, padx = 5, pady = 5)
        Label(self, font = "Helvetica 14 bold", text = "    Brokerage ").grid(row = 8, column = 7, padx = 5, pady = 5)
        Label(self, font = "Helvetica 14 bold", text = "      Total   ").grid(row = 8, column = 8, padx = 5, pady = 5)
        Label(self, font = "Helvetica 14 bold", text = "     Current  ").grid(row = 8, column = 9, padx = 5, pady = 5)
        Label(self, font = "Helvetica 14 bold", text = "      Total   ").grid(row = 8, column = 10,padx = 5, pady = 5)
        Label(self, font = "Helvetica 14 bold", text = "  % Loss/Gain ").grid(row = 8, column = 11, padx = 5, pady = 5)
    
        Button(self, text = "New Record", command = self.dialogue_box).grid(row = 9, column = 0)
    
    def dialogue_box(self):
        top = self.top = Toplevel()
    
        Label(top, text = "Code: ").grid(row = 0, column = 0, sticky = E, padx = 5, pady = 5)
        Label(top, text = "Buy Date: ").grid(row = 1, column = 0, sticky = E, padx = 5, pady = 5)
        Label(top, text = "Quantity: ").grid(row = 2, column = 0, sticky = E, padx = 5, pady = 5)
        Label(top, text = "Paid: ").grid(row = 3, column = 0, sticky = E, padx = 5, pady = 5)
        Label(top, text = "Brokerage: ").grid(row = 4, column = 0, sticky = E, padx = 5, pady = 5)
    
        self.code_main = StringVar()
        Label(self, textvariable = self.code_main).grid(row = 9, column = 3, padx = 5, pady = 5)
    
        self.code_entry = StringVar()
        Entry(top, textvariable = self.code_entry).grid(row = 0, column = 1, padx = 5, pady = 5)
        self.code_entry.set("")
    
        self.date_main = StringVar()
        Label(self, textvariable = self.date_main).grid(row = 9, column = 4, padx = 5, pady = 5)
        self.date_main.set("")
    
        self.date_entry = StringVar()
        Entry(top, textvariable = self.date_entry).grid(row = 1, column = 1, padx = 5, pady = 5)
        self.date_entry.set("")
    
        self.quantity_main = IntVar()
        Label(self, textvariable = self.quantity_main).grid(row = 9, column = 5, padx = 5, pady = 5)
        self.quantity_main.set("")
    
        self.quantity_entry = IntVar()
        Entry(top, textvariable = self.quantity_entry).grid(row = 2, column = 1, padx = 5, pady = 5)
        self.quantity_entry.set("")
    
        self.paid_main = DoubleVar()
        Label(self, textvariable = self.paid_main).grid(row = 9, column = 6, padx = 5, pady = 5)
        self.paid_main.set("")
    
        self.paid_entry = DoubleVar()
        Entry(top, textvariable = self.paid_entry).grid(row = 3, column = 1, padx = 5, pady = 5)
        self.paid_entry.set("")
    
        self.brokerage_main = DoubleVar()
        Label(self, textvariable = self.brokerage_main).grid(row = 9, column = 7, padx = 5, pady = 5)
        self.brokerage_main.set("")
    
        self.brokerage_entry = DoubleVar()
        Entry(top, textvariable = self.brokerage_entry).grid(row = 4, column = 1, padx = 5, pady = 5)
        self.brokerage_entry.set(29.95)
    
        self.total_main = DoubleVar()
        Label(self, textvariable = self.total_main).grid(row = 9, column = 8, padx = 5, pady = 5)
        self.total_main.set("")
    
        self.current_main = DoubleVar()
        Label(self, textvariable = self.current_main).grid(row = 9, column = 9, padx = 5, pady = 5)
        self.current_main.set("")
    
        self.total_two_main = DoubleVar()
        Label(self, textvariable = self.total_two_main).grid(row = 9, column = 10, padx = 5, pady = 5)
        self.total_two_main.set("")
    
        self.loss_gain_main = DoubleVar()
        Label(self, textvariable = self.loss_gain_main).grid(row = 9, column = 11, padx = 5, pady = 5)
        self.loss_gain_main.set("")
    
        Button(top, text = "Add", command = self.add).grid(row = 5, column = 0)
    
    def add(self):
        self.code_main.set(self.code_entry.get())
        self.date_main.set(self.date_entry.get())
        self.quantity_main.set(self.quantity_entry.get())
        paid = ("$", "%.2f" % self.paid_entry.get())
        self.paid_main.set(paid)
        brokerage = ("$", self.brokerage_entry.get())
        self.brokerage_main.set(brokerage)
        total_main = ("$", "%.2f" % self.quantity_entry.get() * self.paid_entry.get() + self.brokerage_entry.get())
        self.total_main.set(total_main)
        self.current_main.set(ystockquote.get_price(self.code_entry.get() + ".AX"))
        total_two = (self.current_main.get() * self.quantity_entry.get())
        self.total_two_main.set(total_two)
        rounded = ((self.total_two_main.get() / self.total_main.get() * 100) - 100)
        self.loss_gain_main.set("%.2f" % rounded)
        self.top.destroy()
    
    if __name__ == "__main__":
    
        master = Tk()
        master.title("Shares program")
        app = Shares(master)
        master.geometry("1280x550+0+0")
        master.mainloop()
    

2 个答案:

答案 0 :(得分:2)

如果元素不是文本,则必须使用+str()连接文本。

self.paid_main.set( "$" + str(self.paid_entry.get()) )

self.paid_main被视为set()的第一个参数。

paid = ("$", self.paid_entry.get())

这会创建元组("$", some_value) - 它不会连接元素。

,在函数print(args1, args2, ...)

中创建元组或分隔参数

这可能是一个问题:self.paid_mainDoubleVar(),您无法为其设置文字。您必须使用StringVar()设置$

的文字

在此

total_main = ("$", "%.2f" % self.quantity_entry.get() *   self.paid_entry.get() + self.brokerage_entry.get())

在使用%

之前,使用括号计算值
total_main = "$%.2f" % (self.quantity_entry.get()*self.paid_entry.get() + self.brokerage_entry.get())

value = self.quantity_entry.get()*self.paid_entry.get() + self.brokerage_entry.get()
total_main = "$%.2f" % value

没有括号Python将其视为

text = "$%.2f" % self.quantity_entry.get()
total_main = text * self.paid_entry.get() + self.brokerage_entry.get()

答案 1 :(得分:0)

我找到了自己问题的答案。事实证明这个代码:

self.total_main.set("$" + str(self.quantity_entry.get() * self.paid_entry.get()))

然后将self.total_main转换为字符串,即使它已初始化为DoubleVar()

我必须通过创建具有相同值的多个变量并在需要时提供它来解决问题。例如。添加self.current_main.set()$将成为字符串因此我需要将current_main设置为具有相同值的另一个变量,这将是一个浮点数,然后计算curent_main * self.quantity_entry.get()将起作用

self.current_main.set("$" + str(ystockquote.get_price(self.code_entry.get() + ".AX")))
curent_main = float(ystockquote.get_price(self.code_entry.get() + ".AX"))
total_two = curent_main * self.quantity_entry.get()
self.total_two_main.set("$%.2f" % total_two)