插座和接线盒未按顺序运行

2024-09-27 23:22:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在做一个在两个树莓皮之间运行的项目。我发现当我用socket代码运行Tkinter代码时,它将首先运行socket代码。这是一个问题,因为我想一个屏幕显示,它正试图连接到一个客户端,但菜单和Tkinter代码只显示一次连接。请有人帮忙,这里有一些代码: 你可以看到我所做的图形哈希大纲45,46,47第45行是麻烦制造者

from tkinter import *
import socket as connect
import sys

host = ''
port = 5490

wn = Tk()
wn.geometry('800x450+300+100')
wn.title('Connect 4 Server')

BordF = Frame(wn)
BordF.pack(side=TOP, fill=BOTH)
font = 'arial 200'
font2 = 'arial 15'
LeftBorderFrame = Frame(BordF, bg='#93D5FF')
LeftBorderFrame.pack(side=LEFT, fill = Y)
LeftBorderSpacer1 = Label(LeftBorderFrame, text=' ', bg='#93D5FF', font=font)
LeftBorderSpacer1.pack(side=LEFT)
RightBorderFrame = Frame(BordF, bg='#93D5FF')
RightBorderFrame.pack(side=RIGHT, fill = Y)
RightBorderSpacer1 = Label(RightBorderFrame, text=' ', bg='#93D5FF', font=font)
RightBorderSpacer1.pack(side=RIGHT)
TopBorderFrame = Frame(BordF, bg='#93D5FF')
TopBorderFrame.pack(side=TOP, fill = X)
TopBorderSpacer1 = Label(TopBorderFrame, text='', bg='#93D5FF', font=font2)
TopBorderSpacer1.pack(side=TOP)
BottomBorderFrame = Frame(BordF, bg='#93D5FF')
BottomBorderFrame.pack(side=BOTTOM, fill = X)
BottomBorderSpacer1 = Label(BottomBorderFrame, text='', bg='#93D5FF', font=font2)
BottomBorderSpacer1.pack(side=BOTTOM)



SwitchF = Frame(BordF)
SwitchF.pack(side=TOP)
ConnGF = Frame(SwitchF)
ConnGF.pack(side=TOP)
InfoL1 = Label(ConnGF, text='Waiting for Connection \n \n ' + connect.gethostbyname(connect.gethostname()), font='arial 20')
InfoL1.pack(side=TOP)

s = connect.socket(connect.AF_INET, connect.SOCK_STREAM)
s.bind((host, port))

#
s.listen(1)
conn, adrr = s.accept()
print('Connected to: ' + adrr[0] + ': ' + adrr[1])
#

wn.mainloop()

Tags: 代码textimporttopconnectsocketfillframe
1条回答
网友
1楼 · 发布于 2024-09-27 23:22:34

问题是mainloop()显示GUI的代码行在连接代码之后。而且mainloop()是一个无止境的循环,因此在GUI销毁之前,在它之后编写的任何代码(即socket连接)都不会发生

解决方案:您可以使用tk.after()延迟方法。这将在执行给定方法之前等待给定的毫秒数:

from tkinter import *
import socket as connect
import sys

host = ''
port = 5490

def connect():
   s = connect.socket(connect.AF_INET, connect.SOCK_STREAM)
   s.bind((host, port))

   #
   s.listen(1)
   conn, adrr = s.accept()
   print('Connected to: ' + adrr[0] + ': ' + adrr[1])
   #


wn = Tk()
wn.geometry('800x450+300+100')
wn.title('Connect 4 Server')

BordF = Frame(wn)
BordF.pack(side=TOP, fill=BOTH)
font = 'arial 200'
font2 = 'arial 15'
LeftBorderFrame = Frame(BordF, bg='#93D5FF')
LeftBorderFrame.pack(side=LEFT, fill = Y)
LeftBorderSpacer1 = Label(LeftBorderFrame, text=' ', bg='#93D5FF', font=font)
LeftBorderSpacer1.pack(side=LEFT)
RightBorderFrame = Frame(BordF, bg='#93D5FF')
RightBorderFrame.pack(side=RIGHT, fill = Y)
RightBorderSpacer1 = Label(RightBorderFrame, text=' ', bg='#93D5FF', font=font)
RightBorderSpacer1.pack(side=RIGHT)
TopBorderFrame = Frame(BordF, bg='#93D5FF')
TopBorderFrame.pack(side=TOP, fill = X)
TopBorderSpacer1 = Label(TopBorderFrame, text='', bg='#93D5FF', font=font2)
TopBorderSpacer1.pack(side=TOP)
BottomBorderFrame = Frame(BordF, bg='#93D5FF')
BottomBorderFrame.pack(side=BOTTOM, fill = X)
BottomBorderSpacer1 = Label(BottomBorderFrame, text='', bg='#93D5FF', font=font2)
BottomBorderSpacer1.pack(side=BOTTOM)



SwitchF = Frame(BordF)
SwitchF.pack(side=TOP)
ConnGF = Frame(SwitchF)
ConnGF.pack(side=TOP)
InfoL1 = Label(ConnGF, text='Waiting for Connection \n \n ' + connect.gethostbyname(connect.gethostname()), font='arial 20')
InfoL1.pack(side=TOP)

#wait two seconds before connecting
wn.after(2000, connect)

wn.mainloop()
``

相关问题 更多 >

    热门问题