我正在尝试使用具有 GUI 的 Python 创建一个相当简单且高效的端口扫描器。
我看过有关如何使用 Tkinter 和 Kivy 编写 Python GUI 应用程序的教程,到目前为止我已经根据这些教程编写了代码
这是我的
.py
文件:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.uix.textinput import TextInput
import socket
import threading
import time
Builder.load_file(r"DemoPortScanner.kv")
def port_scan(port):
for port in range(port_start, port_end):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
conn = sock.connect_ex((target_ip, port))
if conn == 0:
def printer(self):
i = 0
while self.is_printing:
self.root_widget.ids.result.text += f'Port {port}' + 'is Open!' + '\n'
i += 1
time.sleep(1)
def do_print(self):
if not self.is_printing:
self.is_printing = True
self.print_thread = threading.Thread(target=self.printer)
self.print_thread.start()
else:
self.is_printing = False
self.print_thread.join()
self.print_thread = None
else:
pass
except:
print("Connection couldn't be made")
class MyLayout(Widget):
def start_scan(self):
global target
target = self.ids.target_url.text
target = str(target)
global target_ip
target_ip = socket.gethostbyname(target)
print(target_ip)
global port_start
port_start = self.ids.port_start.text
port_start = int(port_start)
print(port_start)
global port_end
port_end = self.ids.port_end.text
port_end = int(port_end)
print(port_end)
self.ids.result.text = ""
port_scan(self)
class DemoPortScannerApp(App):
def build(self):
return MyLayout()
if __name__ == '__main__':
DemoPortScannerApp().run()
这是我的
.kv
文件:
<MyLayout>
BoxLayout:
orientation: 'vertical'
size: root.width, root.height
GridLayout:
rows: 1
TextInput:
id: target_url
text: "www.python.org"
halign: "center"
font_size: 28
size_hint: (1, 1)
multiline : False
GridLayout:
cols: 1
rows: 2
TextInput:
id: port_start
text: '1'
halign: "left"
font_size: 28
size_hint: (1,1)
multiline: False
TextInput:
id: port_end
text: "500"
halign: "left"
font_size: 28
size_hint: (1,1)
multiline: False
GridLayout:
cols: 1
Button:
text: "Start Scan"
size_hint: (1,1)
font_size: 28
on_press: root.start_scan()
GridLayout:
cols: 1
rows: 1
TextInput:
id: result
text: "Open ports will be shown in here"
halign: "center"
font_size: 28
size_hint: (1, 1)
multiline : True
如何在应用程序本身中显示输出(打开端口)?
我能够在控制台中打印它,但是当涉及到显示应用程序时,无论是通过 TextInput 还是使用标签,我都还差得远。
您必须在 .py 和 .kv 中声明您的类,否则您的代码将无法工作。例如在 file1.py 中
class MyLayout(BoxLayout):
pass
在文件1.kv中
<MyLayout>:
id: mylayout
name: 'mylayout'
等等
你有
port_scan
作为全局方法,但是在 MyApp.run()
过程中你没有在任何地方调用它,所以它不会调用。
更改流程并执行以下操作:
class port_scan(Widget):
pass # add code here
然后将小部件添加到布局中,例如在
file1.kv
<MyLayout>:
id: mylayout
name: 'mylayout'
MyWidget: