我已经使用Tkinter GUI构建了一个小程序,让我输入2行文本并将其显示在字符屏幕上。这一切都非常巧妙地工作,直到我按下应用文本,因为那时我似乎在LCD的两条线上都得到了一个奇怪的值。
例如
通缉1号线:“Test
”
通缉第2行:“Please work
”
实际结果
第1行:.3047332040L.304
第2行:7332320L
这是我的代码:
__author__ = 'David'
from Tkinter import *
from Adafruit_CharLCD import Adafruit_CharLCD
from time import sleep
import psutil
chargui = Tk()
lcd = Adafruit_CharLCD()
lcd.begin(16, 1)
class FrameWork:
def __init__(self, master):
frame = Frame(master)
frame.pack()
# Creation
self.lbl_enter1 = Label(frame, text="Enter the first line:")
self.lbl_enter2 = Label(frame, text="Enter the second line:")
self.ent_line1 = Entry(frame)
self.ent_line2 = Entry(frame)
self.btn_apply = Button(frame, text="Apply Text", command=self.applymessage)
self.btn_cpum = Button(frame, text="CPUMem", command=self.CPUMem)
self.btn_quit = Button(frame, text="Quit", command=frame.master.destroy)
# Griding
self.lbl_enter1.grid(row=0, column=0, sticky=E, padx=2)
self.lbl_enter2.grid(row=1, column=0, sticky=E, padx=2)
self.ent_line1.grid(row=0, column=1, sticky=W)
self.ent_line2.grid(row=1, column=1, sticky=W)
self.btn_apply.grid(row=2, column=1, sticky=W, padx=24)
self.btn_cpum.grid(row=2, column=0, columnspan=2, sticky=W, padx=85)
self.btn_quit.grid(row=2, column=1, sticky=E)
def applymessage(self):
lcd.clear()
lcd.message(str(self.ent_line1))
lcd.message(str(self.ent_line2))
def CPUMem(self):
while 1:
lcd.clear()
lcd.message("CPU: " + str(psutil.cpu_percent()) + "%\n")
lcd.message("MEM: " + str(psutil.virtual_memory().percent) + "%")
sleep(1)
g = FrameWork(chargui)
chargui.mainloop()
不介意CPUMem
功能。这个功能很好用。
这只是applymessage(self):
给我带来了麻烦。我一点也没有错。如果我从2 lcd.message函数中删除srt()
,它表示它不能将字符串与int连接。
任何解决方案?
编辑:
我试图将值打印到控制台而不是将它放到LCD上,它仍然给我两个线的奇怪值(它们是内存位置吗?疯狂猜测)
第1行:.3047815368L.3047815608L
第2行:.3047815368L.3047815648L
答案 0 :(得分:2)
正如您所发现的那样,液晶显示器与它无关。问题是尝试将Tkinter Entry
对象转换为str
:
str(self.ent_line1)
调用special method,self.ent_line1.__str__()
来获取对象的字符串表示形式(print
也是如此)。没有期望__str__
被定义为做有用的事情。
实际上,在调查使用交互式shell时,您会发现这个特殊方法是在父类中定义的,而它的docstring是“返回此小部件的窗口路径名”。这就是你所看到的。
您真正想要的是,以字符串形式输入窗口小部件的文字由get()
提供:
print self.ent_line1.get()
答案 1 :(得分:1)
编辑:嗯,根据这个问题的另一个答案,您似乎根本不需要将小部件耦合到变量。我曾几次使用TK,这是我一直以来的方式,但在这个实例中,直接在窗口小部件上调用get()
可能肯定更容易。我将这个答案留给其他背景。
我远不是tkinter的专家,但除非有更多知识渊博的回复,否则我会尽我所能。
问题在于您尝试自己打印小部件对象,但API不能正常工作。如果您通读了documentation for the Entry
widget,则会看到您需要将StringVar
个实例与之关联起来。 This page有更多细节,而且还有section in the Python docs。
因此,在构建Entry
wigets时,您需要执行以下操作:
self.ent_line1_text = StringVar()
self.ent_line2_text = StringVar()
self.ent_line1 = Entry(frame, textvariable=self.ent_line1_text)
self.ent_line2 = Entry(frame, textvariable=self.ent_line2_text)
然后你的applymessage()
看起来像是:
def applymessage(self):
lcd.clear()
lcd.message(self.ent_line1.get())
lcd.message(self.ent_line2.get())
除了用于检索输入框的当前内容的get()
方法之外,如果您需要以编程方式更改它(例如,使用某些默认文本初始化文本框),还有set()
。