Python程序正在为我的16x2字符LCD输出一个奇怪的值

时间:2015-01-10 15:44:02

标签: python tkinter tk

我已经使用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

2 个答案:

答案 0 :(得分:2)

正如您所发现的那样,液晶显示器与它无关。问题是尝试将Tkinter Entry对象转换为str

str(self.ent_line1)

调用special methodself.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()