我想要访问在MyApp的类中定义的文本字段从MyThread的类DEF运行(个体)在它的步骤2'写: 事端那样:如何从不同的类访问GUI类属性?
self.text.insert(1.0,“步骤二“)
代码:
import threading
import time
from Tkinter import *
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
time.sleep(5)
#i want to access the text here
class MyApp(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.my_widgets()
def my_widgets(self):
self.grid()
self.my_button = Button(self, text="Start my function",
command=self.my_function)
self.my_button.grid(row=0, column=0)
self.text = Text(self, width = 60, height = 5, wrap = WORD)
self.text.grid(row = 10, column = 0, columnspan = 2, sticky = W)
def my_function(self):
self.text.insert(1.0,"Step one")
mt = MyThread()
mt.start()
root = Tk()
root.title("Client")
root.geometry("500x500")
app = MyApp(root)
root.mainloop()
我不是很熟悉线程,因此任何帮助将apreciated
@abarnet使用你的答案下来我这样做,但GUI没有响应WHI它正在等待连接
from Tkinter import *
from mtTkinter import *
import socket
import sys
class Application(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid()
self.create_widgets()
def create_widgets(self):
self.submit_button = Button(self, text='start', command = self.my_function)
self.submit_button.grid(row = 2, column = 0, sticky = W)
self.text = Text(self, width = 60, height = 5, wrap = WORD)
self.text.grid(row = 10, column = 0, columnspan = 2, sticky = W)
def my_function(self):
mt = MyThread()
mt.start()
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def start(self):
app.text.insert(6.0,'server started')
app.text.update_idletasks()
app.text.insert(6.0,'\n'+'waiting for client')
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.bind(('',1090))
self.s.listen(1)
self.sc, address = self.s.accept()
address = str(address)
self.instruction = Label(self, text = 'got connection from '+address)
self.instruction.grid(row=7, column = 0, columnspan = 2, sticky = W)
self.instruction.update_idletasks()
msg = self.sc.recv(1024)
s=msg.find('.')
g=msg[s:]
i=1
f = open('file_'+ str(i)+g,'wb') #open in binary
i=i+1
while (True):
l = self.sc.recv(1024)
while (l):
f.write(l)
f.flush()
l = self.sc.recv(1024)
f.close()
self.sc.close()
self.s.close()
root = Tk()
root.title("Server")
root.geometry("500x250")
app = Application(root)
root.mainloop()
你的新的问题是简单的;你只是混淆了'Thread.start'和'Thread.run'。查看我编辑的答案以获取完整的详细信息 – abarnert
它工作得很好,谢谢。 如果我想在MyThread类中执行命令的GUI类中添加另一个按钮我应该怎么做 我想按下一个按钮关闭套接字即执行命令self.sc.close –
如果要控制工作线程以任何方式来自主线程,您需要某种同步或消息传递。但这确实是一个新问题,在评论领域中解释太困难了,所以请开一个关于它的新问题。 – abarnert