2017-06-22 92 views
0

我需要更改標籤,我Tkinter的GUI下面的代碼:正確改變Tkinter的標籤

import os 
import multiprocessing 
from multiprocessing import Process, Pool 
import threading 
import queue 
import tkinter as tk 
from tkinter import * 
from tkinter import ttk 
from time import time 
import minimalmodbus 
import serial 
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL = True 
THREAD_LOCK = threading.Lock() 

class Page(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
    def show(self): 
     self.lift() 

class Page1(Page): 
    def __init__(self, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 

     self.temp_label = tk.Label(self, text='temp', width=10) 
     self.temp_label.pack(side="top") 

     self.connect_button = tk.Button(self, text='Connect', command=self.run_code) 
     self.connect_button.pack(side="top") 

    def run_code(self): 
     all_thread() 

    def set_result(self, read): 
     self.temp_label.config(text=read[2]) 

def all_thread(): #not in class Page1() 
    thread = threading.Thread(target=all_process) 
    thread.start() 

def all_process(): 
    gas = minimalmodbus.Instrument("COM3", 1) 
    gas.serial.baudrate = 9600 
    gas.serial.bytesize = 8 
    gas.serial.parity = serial.PARITY_NONE 
    gas.serial.stopbits = 1 
    gas.serial.timeout = 0.25 
    gas.mode = minimalmodbus.MODE_RTU 

    gas_list = [gas] 
    processes = [] 
    while len(gas_list) > 0: 
     val = 1 
     with THREAD_LOCK: 
      for sen in gas_list: 
       proc = Process(target=main_reader, args=(sen, val)) 
       processes.append(proc) 
       proc.start() 
       val += 1 
      for sen in processes: 
       sen.join() 
      time.sleep(1) 

def main_reader(sen, val): 
    try: 
     read = sen.read_registers(0,42) 
    except OSError: 
     read = "Communication Error" 
    except ValueError: 
     read = "RTU Error" 
    if val == 1: 
     Page1().set_result(read) 


class MainView(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
     p1 = Page1(self) 
     buttonframe = tk.Frame(self) 
     container = tk.Frame(self) 
     buttonframe.pack(side="top", fill="x", expand=False) 
     container.pack(side="top", fill="both", expand=True) 
     p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1) 
     b1 = tk.Button(buttonframe, text="Page 1", command=p1.lift) 
     b1.pack(side="left") 
     p1.show() 

if __name__ == "__main__": 
    root = tk.Tk() 
    main = MainView(root) 
    main.pack(side="top", fill="both", expand=True) 
    root.wm_geometry("1000x600") 
    root.mainloop() 

我想要的temp_label文本改爲第三項中read列表。但是,set_result功能無法正常工作。當數據到達set_result時,temp_label中的文本不會更改。我究竟做錯了什麼?

+0

在你的例子中,沒有調用'set_result'函數,因此沒有人知道'read'是什麼。 – CommonSense

+0

我忘了添加處理那個......我的壞的功能。問題被編輯爲包含該函數'main_reader'。 – GreenSaber

+0

你有沒有做過任何調試?你是否證實'read'是你認爲的? –

回答

0

至少部分問題是您正在創建一個不可見的Page1。所以即使你改變了價值,你也不會看到它。

您必須調用,方法是使p1全球,使得p1main一個實例變量,或者將它傳遞給需要它的功能。

即使這樣,這是行不通的。您不能從創建窗口小部件的進程或線程調用tkinter方法。您必須將數據放在其他線程/進程的隊列中,然後在GUI線程中輪詢隊列。

+0

首先,我認爲你已經回答了我所有的Tkinter問題,我想感謝你的幫助和耐心!其次,如果我對代碼採取了不同的方式,例如在一個應用程序類下擁有所有進程,線程和函數,這是否可行? – GreenSaber