在此之前我几乎没有做过任何编程,所以我为我的代码质量提前道歉。你知道吗
我遇到的问题是,我有一个GUI,我需要打开一个服务器来接收internet流量,但是如果我尝试在一个新进程中打开它,我会得到一个没有定义名称的错误(即使如果我将服务器作为一个常规函数而不是一个新进程打开,它也可以正常工作)。有趣的是,GUI仍然打开,即使我得到了错误。你知道吗
我将在代码后粘贴错误消息。你知道吗
先谢谢你。你知道吗
from Tkinter import *
import socket, re
import netifaces as ni
from multiprocessing import Process, Manager
class Application(Frame):
def __init__(self, master):
""" Initialize the Frame"""
Frame.__init__(self,master)
self.grid()
self.create_widgets()
def create_widgets(self):
self.label1 = Label(text = "Target IPv6 address")
self.label1.grid(row=1, column=0)
self.entry1 = Entry(bd = 5)
self.entry1.grid(row=1, column = 1)
self.button1 = Button(text = "Start", command = self.clientstart)
self.button1.grid(row=1, column = 2)
pr1 = Process(target=self.serverstart)
self.button2 = Button(text = "Start", command = pr1.start())
self.button2.grid(row=2, column=2)
self.label2 = Label(text = "Choose interface to listen")
self.label2.grid(row=2, column=0)
self.interfaces = Menubutton(text="------", relief=RAISED)
self.interfaces.grid(row=2, column=1)
self.interfaces.menu = Menu(self.interfaces, tearoff=0)
self.interfaces["menu"] = self.interfaces.menu
self.menubox()
def menubox(self):
self.interfaces.menu.add_command(label="------", command = lambda interface="------": self.callback(interface))
for interface in ni.interfaces():
if interface.startswith('eth'):
self.interfaces.menu.add_command(label=interface, command = lambda interface=interface: self.callback(interface))
else:
pass
def callback(self, interface):
if interface.startswith('eth'):
self.interfaces["text"] = interface
else:
self.interfaces["text"] = "------"
self._netint = interface
def serverstart(self):
import tcpServer
tcpServer.start(self._netint)
def clientstart(self):
targetip = self.entry1.get()
import tcpClient
tcpClient.startclient(targetip)
root = Tk()
root.title("IPv6 traffic generator")
root.geometry("400x600")
app = Application(root)
root.mainloop()
Process Process-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "gui.py", line 57, in serverstart
tcpServer.start(netint)
NameError: global name 'netint' is not defined
编辑:
我试过了第一次答复中的建议,但还是有错误
Process Process-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "gui.py", line 55, in serverstart
tcpServer.start(self._netint)
AttributeError: Application instance has no attribute '_netint'
这是你的密码tcpServer.py文件你知道吗
import socket
import netifaces as ni
def start(self, _netint):
host = ni.ifaddresses(self._netint)[ni.AF_INET6][0]['addr']
port = 5000
s = socket.socket(socket.AF_INET6)
s.bind((host, port))
s.listen(1)
c, addr = s.accept()
print "Connection from: " + str(addr)
while True:
data = c.recv(1024)
if not data:
break
print "from connected user: " + str(data)
data = str(data).upper()
print "sending: " + str(data)
c.send(data)
c.close()
if __name__ == '__main__':
start()
在这里tcpClient.py文件你知道吗
import socket
def startclient(targetip):
host = targetip
port = 5000
s = socket.socket(socket.AF_INET6)
s.connect((host,port))
message = raw_input('Send message: ')
while message != 'q':
s.send(message)
data = s.recv(1024)
print 'Recieved from server: ' + str(data)
message = raw_input('Send message: ')
s.close()
if __name__ == '__main__':
startclient()
请注意,我的服务器和客户端程序只是暂时的测试。你知道吗
我实际上无法运行您的代码进行检查,但似乎可以这样修复错误:
一般来说,最好尽量避免使用
global
。使用类的好处之一是它提供了一个共享的名称空间,所有类实例的方法都可以通过self
访问该名称空间。你知道吗相关问题 更多 >
编程相关推荐