2013-07-20 2 views
0

Я хочу, чтобы полученные данные были центрированы на окне tk вместо печати сверху. Поэтому я хочу написать код с помощью виджета ярлыка виджета TEXT. (Виджет TEXT отпечатан сверху и LABEL виджет центрирует данные в окне tk). Виджет-метка имеет элементы управления «ANCHOR», где текст размещается, если у виджета больше места, чем требуется для текста. По умолчанию используется anchor = CENTER, который центрирует текст в доступном пространстве. Но в моем коде я всегда удаляю и вставляю данные все время, согласно моим знаниям, опции удаления и вставки доступны только в текстовом виджете, возможно ли это в виде ярлыка Label. , пожалуйста, помогите мне. Я попытался изменить свой код bt с помощью виджета LABEL, но couls не удалось. может кто-то, пожалуйста, помогите мне изменить свой код, чтобы использовать виджет ярлыка. спасибо.конвертировать код из Tkinter TEXT в Tkinter LABEL

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() 

ответ

2

Этикетка виджет 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) 
+0

ок, спасибо. я постараюсь с этим. – vaasu

+0

Я столкнулся с такой ошибкой. Traceback (последний последний вызов): Файл «C:/Python27/python/Новая папка/тестирование 1.py», строка 44, в app = App() Файл «C:/Python27/python/Новая папка/testing 1.py ", строка 26, в __init__ bg = self.cget ('bg'), рельеф = 'flat') Файл" C: \ Python27 \ lib \ lib-tk \ Tkinter.py ", строка 2537, in __init__ Widget .__ init __ (self, master, 'label', cnf, kw) Файл «C: \ Python27 \ lib \ lib-tk \ Tkinter.py», строка 2036, в __init__ (widgetName, self ._w) + extra + self._options (cnf)) TclError: плохое расстояние экрана «word» – vaasu

+1

@vaasu Это происходит потому, что вы используете опцию 'wrap = 'word'' в конструкторе метки. Если вы замените текст ярлыком, вы должны использовать [правильные параметры] (http://effbot.org/tkinterbook/label.htm#Tkinter.Label.config-method), которые варьируются от виджета к виджету. –

Смежные вопросы