2016-07-20 11 views
0

私が達成しようとしていることは非常に簡単です。Pythonで別のスレッド/クラスから変数を参照していますか?

基本的には、同じURLからデータを取得し、「データ」という変数を毎回テキストとともに更新するスレッドが連続的にループしています。変数はクラス内にローカルに格納されます。

私はメインフレームである2番目のクラスを持っています。最初のクラスの変数が何に設定されていても、最新のデータが表示されます。

問題は、他のクラス/スレッドからその変数を参照する方法が見つからないということです。

私が設定して参照しようとしている変数の名前は「データ」です。ここ

ソースコードは次のとおり

#!/Library/Frameworks/Python.framework/Versions/3.5/bin/python3 
# -*- coding: utf-8 -*- 

from tkinter import * 
import time 
import urllib.request 
from bs4 import BeautifulSoup 
import threading 
from queue import Queue 

class httpReq(threading.Thread): 

    def run(self): 

     i = 0 
     while 1<5: 
      url = "https://twitter.com/realDonaldTrump" 
      page = urllib.request.urlopen(url) 
      soup = BeautifulSoup(page, "html.parser") 
      self.data = data = soup.title.text 
      print(x) 

x = httpReq() 
x.start() 

class Example(Frame, httpReq): 

    def __init__(self, parent): 
     Frame.__init__(self, parent) 

     self.parent = parent 
     self.initUI() 

    def initUI(self): 

     self.parent.title("IT Support App") 
     self.pack(fill=BOTH, expand=True) 

     frame1 = Frame(self) 
     frame1.pack(fill=X) 

     lbl1 = Label(frame1, text="Primary Video Stream", width= 20) 
     lbl1.pack(side=LEFT, padx=5, pady=5) 


     lbl6 = Label(frame1, text= x.data) 
     lbl6.pack(fill=X, padx=5, expand=True) 

     frame2 = Frame(self) 
     frame2.pack(fill=BOTH, expand=True) 

     lbl2 = Label(frame2, text="Primary Audio Stream", width=20) 
     lbl2.pack(side=LEFT, padx=5, pady=5) 

     entry2 = Entry(frame2) 
     entry2.pack(fill=X, padx=5, expand=True) 

     frame3 = Frame(self) 
     frame3.pack(fill=BOTH, expand=True) 

     lbl3 = Label(frame3, text="Backup Video Stream", width=20) 
     lbl3.pack(side=LEFT, padx=5, pady=5) 

     entry3 = Entry(frame3) 
     entry3.pack(fill=X, pady=5, padx=5, expand=True) 

     frame4 = Frame(self) 
     frame4.pack(fill=BOTH, expand=True) 

     lbl4 = Label(frame4, text="Backup Audio Stream", width=20) 
     lbl4.pack(side=LEFT, padx=5, pady=5) 

     entry4 = Entry(frame4) 
     entry4.pack(fill=X, pady=5, padx=5, expand=True) 

     frame5 = Frame(self) 
     frame5.pack(fill=X) 

     lbl5 = Label(frame5, text="IPTV", width=20) 
     lbl5.pack(side=LEFT, padx=5, pady=5) 

     entry5 = Entry(frame5) 
     entry5.pack(fill=X, pady=5, padx=5, expand=True) 

def main(): 

    root = Tk() 
    root.geometry("1920x1080") 
    app = Example(root) 
    root.mainloop() 


if __name__ == '__main__': 
    main() 
+0

「Example」クラスでhttpReqインスタンスへの参照を保存するために2番目の引数を取ることができませんでしたか?それで、あなたはあなたの変数を手に入れることができると思います。 –

+0

ありがとうフレッド。しかし、私はすでにコードで行っていることだと思います。または私はあなたを誤解していますか? 。 。 。これは私がそれをやろうとする行です: クラス例(フレーム、httpReq): –

答えて

0

それは、これを行うための様々な方法があることが判明しました。しかし、私の目的のために(1つのスレッドだけが変数に書き込むので、他のものは読み取り専用です)、グローバル変数を使用するとジョブが実行されることがわかりました。

まず、変数を宣言してスレッドの外側のnoneに設定します。

#!/Library/Frameworks/Python.framework/Versions/3.5/bin/python3 
# -*- coding: utf-8 -*- 

from tkinter import * 
import time 
import urllib.request 
from bs4 import BeautifulSoup 
import threading 
from queue import Queue 

data = None 

class httpReq(threading.Thread): 
    def run(self): 

     global data 

     while True: 
      url = "https://twitter.com/realDonaldTrump" 
      page = urllib.request.urlopen(url) 
      soup = BeautifulSoup(page, "html.parser") 
      data = soup.title.text 
      print(data) 

x = httpReq() 
x.start() 

class Example(Frame): 

     global data 

     def __init__(self, parent): 
      Frame.__init__(self, parent) 
      self.parent = parent 
      self.initUI() 

     def initUI(self): 
      self.parent.title("Example App") 
      self.pack(fill=BOTH, expand=True) 

      frame1 = Frame(self) 
      frame1.pack(fill=X) 

      lbl1 = Label(frame1, text="Title Data:", width= 20) 
      lbl1.pack(side=LEFT, padx=5, pady=5) 

      lbl2 = Label(frame1, text= data) 
      lbl2.pack(fill=X, padx=5, expand=True) 

def main(): 
    root = Tk() 
    root.geometry("600x200") 
    app = Example(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 
0

は、whileループとrunメソッドの外のデータ変数を宣言してみてください。 はその後、参考のためhttpReq.data

使用している静的変数を呼び出すことができます。Static class variables in Python

+0

ありがとう。私はこれを試しました。データ変数を宣言し、最初のスレッドの外に "None"に設定します。しかし、私がこのメソッドを実行すると、フレームクラスはwhileループがそれを変更しなければならない値ではなく、 "None"値しか見ることができません。また、私が変数を宣言して、**最初のスレッド**内で** none ** ** whileループの外に**設定した場合、私は同じ問題を抱えています。メインフレームにはデータ変数が表示されません。 –

+0

私は近づいていると思う。 。 。だから、私は、スレッド内の変数を宣言しようとしましたが、クラス定義の外でした。 。 。現在、メインフレームはhttpReqの "data"属性を認識しますが、 "None"の値しか表示しません。 whileループがデータ変数を更新しないか、またはメインフレームが変数の値を動的に更新しないようですか? –

+0

メインフレームがデータ属性を呼び出す前にwhileループが実行されていますか?そうでない場合、それがあなたの問題です。「データ」は決して更新されません。 – SilenT612

関連する問題