我正在创建一个简单的GUI程序来测量某个事件的时间。我收到一个错误:
/usr/bin/python3.5 /home/cali/PycharmProjects/str8/str8.py Traceback (最近一次调用最后一次):文件 " /home/cali/PycharmProjects/str8/str8.py" ;,第51行,在 app = App(root)File" /home/cali/PycharmProjects/str8/str8.py" ;,第22行,在 init 中 标签(self,text = measurement +":" + self.counters [measurement],font =' Verdana 8')。grid(row = i + 1,column = 0, sticky = W)TypeError:Can&#t; t 转换' DoubleVar'隐含地反对str
使用退出代码1完成处理
我试过这个:
Label(self, text=measurement + ": " + str(self.counters[measurement]), font='Verdana 8').grid(row=i+1, column=0, sticky=W)
......但它给了我这个:
这就是我所做的:
# str8.py
# Program to count time from a certain event
from tkinter import *
from datetime import *
class App(Frame):
def __init__(self, *args, **kwargs):
Frame.__init__(self, *args, **kwargs)
self.grid(sticky = N + W + E + S)
Label(self, text = 'You have been STR8 for:', font="Verdana 8 bold").grid(row=0, sticky=W)
self.counters = dict()
measurements = [ 'Years', 'Weeks', 'Days', 'Hours', 'Minutes', 'Seconds' ]
for i, measurement in enumerate(measurements):
self.counters[measurement] = DoubleVar()
Label(self, text=measurement + ": " + self.counters[measurement], font='Verdana 8').grid(row=i+1, column=0, sticky=W)
self.counters[measurement].set(0)
Button(self,
text="EXIT",
font="Verdana 8",
height=1,
width=19,
command=quit).grid(row=7, column=0)
self.increment()
def increment(self):
event = datetime(2017, 4, 4, 0, 0, 0)
today = datetime.now()
str8 = today - event
self.counters['Seconds'].set(round(str8.total_seconds(), 2))
self.counters['Minutes'].set(round(str8.total_seconds()/ 60, 2))
self.counters['Hours'].set(round(str8.total_seconds() / 3600, 2))
self.counters['Days'].set(round(str8.total_seconds() / (3600 * 24), 2))
self.counters['Weeks'].set(round(str8.total_seconds() / (3600 * 24 * 7), 2))
self.counters['Years'].set(round(str8.total_seconds() / (3600 * 24 * 7 * 52), 2))
self.after(1000, self.increment)
if __name__ == '__main__':
root = Tk()
app = App(root)
root.title("STR8")
root.resizable(width=False, height=False)
app.mainloop()
答案 0 :(得分:1)
Label可以使用text
参数显示一些文本,或者它可以使用textvariable
参数显示来自tkinter变量的值,如DoubleVar。它不能两者兼顾。使用它:
lbl = Label(self, text=measurement + ": ", font='Verdana 8')
lbl.grid(row=i+1, column=0, sticky=W)
或者这个:
lbl = Label(self, textvariable=self.counters[measurement], font='Verdana 8')
lbl.grid(row=i+1, column=0, sticky=W)
编辑:您的问题的解决方案是制作可以同时处理两者的自己的Label类型:
import tkinter as tk
from datetime import datetime
class FormatLabel(tk.Label):
'''A new type of Label widget that allows both a text and textvariable'''
def __init__(self, master=None, **kwargs):
self.textvariable = kwargs.pop('textvariable', tk.StringVar(master))
self.text = kwargs.pop('text', '{}')
self.textvariable.trace('w', self.update_text)
tk.Label.__init__(self, master, **kwargs)
def update_text(self, *args):
self.config(text=self.text.format(self.textvariable.get()))
class App(tk.Frame):
def __init__(self, master=None, **kwargs):
tk.Frame.__init__(self, master, **kwargs)
lbl = tk.Label(self, text = 'You have been STR8 for:', font="Verdana 8 bold")
lbl.grid(row=0, sticky=tk.W)
self.counters = dict()
measurements = [ 'Years', 'Weeks', 'Days', 'Hours', 'Minutes', 'Seconds' ]
for i, measurement in enumerate(measurements):
self.counters[measurement] = tk.DoubleVar()
lbl = FormatLabel(self,
text=measurement + ": {:.2f}", # set the rounding here
textvariable = self.counters[measurement],
font='Verdana 8')
lbl.grid(row=i+1, column=0, sticky=tk.W)
self.counters[measurement].set(0)
btn = tk.Button(self,
text="EXIT",
font="Verdana 8",
height=1,
width=19,
command=quit)
btn.grid(row=7, column=0)
self.increment()
def increment(self):
event = datetime(2017, 4, 4, 0, 0, 0)
today = datetime.now()
str8 = (today - event).total_seconds()
self.counters['Seconds'].set(str8)
self.counters['Minutes'].set(str8 / 60.)
self.counters['Hours'].set(str8 / 3600.)
self.counters['Days'].set(str8 / (3600. * 24))
self.counters['Weeks'].set(str8 / (3600. * 24 * 7))
self.counters['Years'].set(str8 / (3600. * 24 * 7 * 52))
self.after(1000, self.increment)
def main():
root = tk.Tk()
app = App(root)
app.pack()
root.title("STR8")
root.resizable(width=False, height=False)
app.mainloop()
if __name__ == '__main__':
main()
注意我还修复了代码的其他部分;最值得注意的是,你不应该使用通配符导入(from module import *
),你不应该在定义它们的同一行上布局小部件,并且你应该尽量不重复代码。