我希望得到一些关于我花费太多时间试图解决的问题的指导。每当我找到解决方案时,另一个问题就会取而代之。
我的目标是“简单地”对某些数字做一些基本数学,然后在浮点变量的开头添加一个'$'。
起初我试过这个:
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'
同样,我必须遗漏一些东西,因为你什么时候不能乘以浮动?
如果我选择不在任何事情面前添加美元符号,我可以解决所有问题,但之后我会以第二好的方式解决问题。我希望有人可以帮助我解决以下问题:
我应该注意,我必须将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()
答案 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_main
是DoubleVar()
,您无法为其设置文字。您必须使用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)