我正在尝试构建一个简单的 GUI,包括一个二维码读取器,以便使用 Ubuntu 上的 Python 将数据发送到远程服务器,用于学校项目。我已经设置了一个简单的服务器来接收来自 sca 的消息...
我正在尝试构建一个简单的 GUI,包括一个二维码读取器,以便使用 Ubuntu 上的 Python 将数据发送到远程服务器,用于学校项目。我已经设置了一个简单的服务器,通过 tcp/ip 接收来自扫描仪的消息:
import socket
from Crypto.Cipher import AES
def main():
# Server mit gegebener Adresse starten
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("192.168.1.40", 9999))
server.listen()
while True:
client, address = server.accept()
msg = client.recv(1024).decode('ASCII')
print(msg)
if __name__ == '__main__':
main()
如果我运行一个简单的测试客户端,所有消息都会被收到:
import socket
client = socket.socket()
try:
client.connect(("192.168.1.40",9999))
for i in range(1,10):
client.send("\nHallo Server, ich bin dein Client und will was\n".encode('ASCII'))
except:
print("Server nicht verfügbar\n\n")
我在服务器上逐行打印了 9 条消息。
实际的 GUI 是
import PySimpleGUI as sg
from pyzbar import pyzbar
import cv2
import os
import socket
import math
from time import time, sleep
from Crypto.Cipher import AES
H1 = 0
def read_qr():
vid = cv2.VideoCapture(0)
qr = False
while(not qr):
ret, frame = vid.read()
qr = pyzbar.decode(frame)
duration = .1
freq = 3000
os.system('play -nq -t alsa synth {} sine {}'.format(duration,freq))
qr = qr[0].data.decode().split(':::')
vid.release()
cv2.destroyAllWindows()
return qr
def si_msg(body):
global H1
H1 += 1
H2 = socket.gethostname().split('-')[2]
H3 = 0
H5, H4 = math.modf(time())
H6 = 2
H7 = len(body.encode('ASCII'))
si_msg = " ".join([str(H1), H2, str(H3), str(int(H4)), str(int(H5*10**8)), str(H6), str(H7), body])
return si_msg
def main():
sg.theme('PythonPlus')
status = 'Verbindung getrennt'
socket.setdefaulttimeout(2.5)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
layout = [ [sg.Text('Server-Adresse:'),sg.Input(key = 'k_server', default_text='192.168.1.40:9999')],
[sg.Button('Server bestätigen')],
[sg.Text('Status:'), sg.Text(status, key = 'k_status')],
[sg.Exit()]]
window = sg.Window('Virtueller Login', layout)
while True:
event, values = window.read()
if event == sg.WIN_CLOSED or event == 'Exit':
break
elif event == 'Server bestätigen':
status = 'Verbindung zum Server wird hergestellt'
window['k_status'].update(status)
server = values['k_server'].split(':')
try:
client.connect((server[0],int(server[1])))
status = 'Verbindung hergestellt: ausgeloggt'
window['k_status'].update(status)
except:
status = 'Verbindungsversuch fehlgeschlagen'
window['k_status'].update(status)
sg.popup('FEHLER: Server nicht gefunden. Bitte prüfen Sie die Adresse oder wenden Sie sich an den Administrator')
continue
window.start_thread(lambda: read_qr(), 'Code gefunden')
if event == 'Code gefunden':
qr = values[event][0]
msg = si_msg(qr)
print(msg)
client.send(msg.encode('ASCII'))
sleep(2)
client.close()
window.close()
if __name__ == '__main__':
main()
运行此主程序使我能够扫描二维码/条形码,该二维码/条形码已成功包装在标题中(我必须制作这个丑陋的东西)并在每次扫描时打印, H1
每次扫描时迭代扫描计数器。我在客户端或服务器上没有收到任何错误,但服务器只收到第一次扫描。
为了确保它与 pysimplegui 处理的多线程无关,我省略了以下行
window.start_thread(lambda: read_qr(), 'Code gefunden')
if event == 'Code gefunden':
qr = values[event][0]
msg = si_msg(qr)
print(msg)
client.send(msg.encode('ASCII'))
sleep(2)
并用直接扫描命令替换它们(冻结 GUI):
qr = read_qr()[0]
msg = si_msg(qr)
print(msg)
client.send(msg.encode('ASCII'))
这样我就可以启用连接、扫描代码、发送消息,然后循环似乎停止工作,我无法再扫描。我可以再次按下 GUI 的连接按钮,从而“重新连接”到服务器(从未断开连接?)再次扫描,但它不会向服务器发送消息,也不会第三次建立连接。
或者,简单地手动添加第二条消息也无法发送,这也不起作用:
qr = read_qr()[0]
msg = si_msg(qr)
print(msg)
client.send(msg.encode('ASCII'))
sleep(0.5)
msg = si_msg(qr)
print(msg)
client.send(msg.encode('ASCII'))
计数器迭代并打印,但没有发送第二条消息,连接似乎丢失,我可以重新连接,再次扫描(不发送任何消息),就是这样,再也没有第三次机会。
由于我没有收到任何错误,我对此有些困惑。我认为这与 pysimplegui 无关,因为连续的手动消息也没有发送,但我不知道,并乐意提供任何帮助...
我感到非常沮丧,并且参考了所有我能参考的内容(emacs wiki,相关的溢出问题),我觉得我几乎尝试了所有方法来将我的大写锁定重新绑定到控制,以便将其用作我的 c...
我感到非常沮丧,并且参考了所有我能参考的资料(emacs wiki,相关的溢出问题),我觉得我几乎尝试了所有方法将我的 caps lock 重新绑定到 control,以便将其用作 emacs 中的 ctrl 模式。
我使用过 gnome-tweaks,尝试过 .xmodmap 文件(包括在重启和运行时应用它 xmodmap ~/.xmodmap
,还尝试过使用该 ctrl:nocaps
选项编辑 /etc/default/keyboard。无论重启多少次,似乎都不起作用。我的 xmodmap:
clear lock
clear control
keycode 66 = control_L
keycode 37 = control_L
add control = Control_L Control_R
xev
并 keyboardtester.com
成功将我的 caps 键读取为附加的 control_L,但无论我打开哪个 emacs(通过 rofi drun、通过 sudo、-nw、从 alacritty 调用它),它都无法识别已按下的 caps lock 键。有人以前处理过这个问题吗?我不确定是不是因为我使用的是 macbook/VMware Fusion,还是因为我尝试了太多路线,现在它们以某种方式发生冲突。任何帮助都感激不尽!