2016-07-20 3 views
0

내가 성취하려는 것은 아주 간단합니다.파이썬에서 다른 스레드/클래스의 변수를 참조 하시겠습니까?

그래서 기본적으로 동일한 URL에서 데이터를 가져 와서 "데이터"라는 변수를 업데이트 할 때마다 매번 텍스트가 반복되는 스레드가 있습니다. 변수는 클래스 내에 로컬로 저장됩니다.

그럼 메인 프레임 인 두 번째 클래스가 있습니다. 첫 번째 클래스의 변수가 무엇이든간에 결정되는 최신 데이터를 표시해야합니다.

문제는 다른 클래스/스레드에서 해당 변수를 참조하는 방법을 찾을 수 없다는 것입니다.

내가 설정 중이며 참조하려는 변수의 이름은 "데이터"입니다. while 루프 및 실행 방법 이외의 데이터 변수를 선언

#!/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 인스턴스에 대한 참조를 저장하는 데 두 번째 인수를 사용할 수 없습니까? 그렇다면 변수를 파악할 수 있습니다. –

+0

감사합니다. Fred. 그러나, 나는 그것이 이미 코드에서 한 것이라고 생각한다. 아니면 내가 너를 오해하고 있니? . . . 이것은 내가하려고하는 선이다 : 클래스 예 (프레임, httpReq) : –

답변

0

그것은이 일을 여러 가지 방법이 있다는 것을 밝혀졌습니다. 그러나 내 목적을 위해 (단 하나의 스레드는 변수에 쓰고 다른 변수는 읽기 전용이므로) 전역 변수를 사용하면 작업이 수행된다는 것을 알게되었습니다.

먼저 스레드 외부에서 변수를 선언하고 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

시도 : 여기

소스 코드이다. 은 그럼 당신은 참고 httpReq.data

사용하여 정적 변수를 호출 할 수 있습니다 Static class variables in Python

+0

고마워. 나는 이것을 시도했다. 데이터 변수를 선언하고 첫 번째 스레드 외부에서 "없음"으로 설정합니다. 그러나 메소드를 실행할 때 프레임 클래스는 while 루프가 변경해야하는 값이 아닌 "없음"값만 봅니다. 또한 변수를 선언하고 그것을 ** 첫 번째 스레드 ** 내에서 ** ** while ** 루프 외부 ** ** 설정하면 동일한 문제가 있습니다. 메인 프레임에는 데이터 변수가 표시되지 않습니다. –

+0

나는 점점 가까워지고 있다고 생각한다. . . 그래서 그냥 스레드 내에서 변수를 선언했지만 클래스 정의 밖에서 시도했다. . . 이제 메인 프레임은 httpReq의 "데이터"속성을 인식하지만 "없음"값만 봅니다. while 루프가 데이터 변수를 업데이트하지 않거나 메인 프레임이 변수의 값을 동적으로 업데이트하지 않는 것 같습니다. –

+0

메인 프레임이 데이터 속성을 호출하기 전에 while 루프가 실행되는지 확인 하시겠습니까? 그것이 사실이 아니라면 그것은 당신 문제입니다. '데이터'는 절대로 업데이트되지 않습니다. – SilenT612

관련 문제