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 methodself.ent_line1.__str__() 以获取对象的字符串表示形式(print 也是如此)。没有期望 __str__ 被定义为做一些有用的事情。

实际上,使用交互式 shell 进行调查,您会发现这个特殊方法是在父 class 中定义的,它的文档字符串是 "Return the window path name of this widget." 这就是您所看到的.

您真正想要的,即作为字符串输入到小部件中的文本,由 get():

给出
print self.ent_line1.get()