2017-06-22 8 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() 

は、私がreadリスト内の3番目の項目にtemp_labelのテキストを変更したいです。ただし、set_result関数が正しく動作していません。データがset_resultになると、temp_labelのテキストは変更されません。私は間違って何をしていますか?

+0

あなたの例では、 'set_result'関数を呼び出すことはないので、誰も' read'が何であるか知っていません。 – CommonSense

+0

それを扱う関数を追加するのを忘れていた...私の悪い。質問は、その関数 'main_reader'を含むように編集されました。 – GreenSaber

+0

デバッグを済ませましたか? 'read'があなたの考えであると確信しましたか? –

答えて

0

問題の少なくとも一部は、新規 が表示されないことです。あなたが値を変更しても、あなたはそれを見ません。

あなたはmainp1インスタンス変数を作り、またはそれを必要とする関数に渡し、p1はグローバル作るいずれかの方法で、を呼び出すする必要があります。

でも、これはうまくいかないでしょう。ウィジェットを作成したプロセスやスレッド以外のプロセスやスレッドからtkinterメソッドを呼び出すことはできません。他のスレッド/プロセスのキューにデータを置いて、GUIスレッドのキューをポーリングする必要があります。

+0

まず、私はTkinterのすべての質問にあなたが答えたと思います。私はあなたの助けと忍耐に感謝したいと思います!第2に、私がコードを使って別の方法、つまりすべてのプロセス、スレッド、関数を1つのアプリケーションクラスの下に置いた場合、これは機能しますか? – GreenSaber

関連する問題