我想要实现的目标非常简单。
所以基本上,我有一个连续循环的线程,从同一个URL抓取数据并更新一个名为“data”的变量,每次都有文本。变量存储在类中的本地。
然后我有一个第二类是大型机。它应该显示最新数据,这是由第一个类中的变量设置为。
决定的问题是我找不到从其他类/线程引用该变量的方法。
我正在设置并尝试引用的变量的名称是“data”。
以下是源代码:
#!/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 :(得分:0)
尝试在while循环和run方法之外声明数据变量。 然后,您可以使用 httpReq.data
调用该静态变量答案 1 :(得分:0)
事实证明,有各种方法可以做到这一点。然而,出于我的目的,(因为只有一个线程写入变量,而其他线程只写入),我发现使用全局变量可以完成工作。
首先在线程外声明并将变量设置为none。然后在每个线程中,将变量声明为global:
#!/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()