Python 程序正在向我的 16x2 字符 LCD 输出一个奇怪的值
Python program is outputting a strange value to my 16x2 Character LCD
我用 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
编辑:嗯,根据这个问题的其他答案,您似乎根本不需要将小部件耦合到变量。我使用 TK 的几次都是我一直这样做的方式,但在这种情况下直接在小部件上调用 get()
可能肯定更容易。我将此答案留作补充背景。
我远不是 tkinter 的专家,但除非有人更有知识的回复,否则我会尽力而为。
问题是您试图自己打印小部件对象,但 API 并不是那样工作的。如果你也通读了documentation for the Entry
widget, you'll see that you need to associate a StringVar
instance with it. This page has some more details, and there's a section in the Python docs。
因此,在构建 Entry
wiget 时,您需要执行以下操作:
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()
).
如您所见,LCD与它无关。问题是试图将 Tkinter Entry
对象转换为 str
:
str(self.ent_line1)
调用 special method、self.ent_line1.__str__()
以获取对象的字符串表示形式(print
也是如此)。没有期望 __str__
被定义为做一些有用的事情。
实际上,使用交互式 shell 进行调查,您会发现这个特殊方法是在父 class 中定义的,它的文档字符串是 "Return the window path name of this widget." 这就是您所看到的.
您真正想要的,即作为字符串输入到小部件中的文本,由 get()
:
给出
print self.ent_line1.get()
我用 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
编辑:嗯,根据这个问题的其他答案,您似乎根本不需要将小部件耦合到变量。我使用 TK 的几次都是我一直这样做的方式,但在这种情况下直接在小部件上调用 get()
可能肯定更容易。我将此答案留作补充背景。
我远不是 tkinter 的专家,但除非有人更有知识的回复,否则我会尽力而为。
问题是您试图自己打印小部件对象,但 API 并不是那样工作的。如果你也通读了documentation for the Entry
widget, you'll see that you need to associate a StringVar
instance with it. This page has some more details, and there's a section in the Python docs。
因此,在构建 Entry
wiget 时,您需要执行以下操作:
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()
).
如您所见,LCD与它无关。问题是试图将 Tkinter Entry
对象转换为 str
:
str(self.ent_line1)
调用 special method、self.ent_line1.__str__()
以获取对象的字符串表示形式(print
也是如此)。没有期望 __str__
被定义为做一些有用的事情。
实际上,使用交互式 shell 进行调查,您会发现这个特殊方法是在父 class 中定义的,它的文档字符串是 "Return the window path name of this widget." 这就是您所看到的.
您真正想要的,即作为字符串输入到小部件中的文本,由 get()
:
print self.ent_line1.get()