【问题标题】:converting code from Tkinter TEXT to Tkinter LABEL将代码从 Tkinter TEXT 转换为 Tkinter LABEL
【发布时间】:2013-07-19 16:12:12
【问题描述】:

我希望接收到的数据以 tk 窗口为中心,而不是从顶部打印。所以我想使用 Label 小部件而不是 TEXT 小部件来编写代码。(TEXT 小部件从顶部打印,LABEL 小部件将数据集中在 tk 窗口上)如果小部件的空间比文本需要的多,标签小部件具有“锚”选项控制文本的位置。默认值为anchor=CENTER,它将文本在可用空间中居中。 但是在我的代码中,我总是删除和插入数据,据我所知,删除和插入选项仅在文本小部件中,是否可以在标签小部件中。 请帮帮我。 我尝试使用 LABEL 小部件更改我的代码 bt,但无法成功。有人可以帮我更改我的代码以使用标签小部件。 谢谢。

import serial
import threading
import Queue
import Tkinter as tk
from Tkinter import *


class SerialThread(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue
    def run(self):
        s = serial.Serial('COM11',9600)

        while True:
            if s.inWaiting():
                text = s.readline(s.inWaiting())
                self.queue.put(text)

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.geometry("1360x750")
        frameLabel = tk.Frame(self, padx=40, pady =40)
        self.text = tk.Text(frameLabel, wrap='word', font='TimesNewRoman 40',
                        bg=self.cget('bg'), relief='flat')
        frameLabel.pack()
        self.text.pack()
        self.queue = Queue.Queue()
        thread = SerialThread(self.queue)
        thread.start()
        self.process_serial()

    def process_serial(self):
        firstitem = True
        while self.queue.qsize():
            try:
                new = self.queue.get()
                if firstitem:
                    self.text.delete(1.0, 'end')
                firstitem = False
                self.text.insert('end', new)
            except Queue.Empty:
                pass
        self.after(100, self.process_serial)

app = App()
app.mainloop()

【问题讨论】:

    标签: python tkinter pyserial


    【解决方案1】:

    Tkinter 标签小部件有一个text 选项来指示正在显示的文本。如果要更改小部件显示的所有内容,请替换

    self.text = tk.Text(frameLabel, ...)
    
    # ...
    
    new = self.queue.get()     
    self.text.delete(1.0, 'end')
    self.text.insert('end', new)
    

    有了这个:

    self.label = tk.Label(frameLabel, ...)
    
    # ...
    
    new = self.queue.get()     
    self.label.config(text=new)
    

    【讨论】:

    • 我正面临这种错误。回溯(最后一次调用):文件“C:/Python27/python/New folder/testing 1.py”,第 44 行,在 app = App() 文件“C:/Python27/python/New folder/ testing 1.py”,第 26 行,在 init bg=self.cget('bg'), Relief='flat') 文件“C:\Python27\lib\lib-tk\Tkinter. py",第 2537 行,在 init Widget.__init__(self, master, 'label', cnf, kw) 文件 "C:\Python27\lib\lib-tk\Tkinter.py",行2036, in init (widgetName, self._w) + extra + self._options(cnf)) TclError: bad screen distance "word"
    • @vaasu 这是因为您在标签的构造函数中使用了选项wrap='word'。如果你用标签替换文本,你应该使用correct options,它因小部件而异。
    • @Rodas:我更改了小部件选项,它现在可以工作了。但是我如何在标签小部件中实现这一点。 def process_serial(self): firstitem = True while self.queue.qsize(): try: new = self.queue.get() if firstitem: self.text.delete(1.0, 'end') firstitem = False self.text .insert('end', new)
    • 它只显示队列中的最后一个元素;如何处理多个队列项。
    • @vaasu 发生这种情况是因为您在插入新项目后删除了小部件的内容:self.text.delete(1.0, 'end')。只需删除此行,它将显示所有项目。
    猜你喜欢
    • 2018-06-26
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多