我已经退休,正在努力掌握Python(从代码中可以看出!),并试图使用笔记本电脑和平板电脑(都在Windows 8下运行Python 3.3.5)编写一个简单的游戏
简而言之,我的问题是:
我有两个简单的工作程序(如下):一个等待按钮点击并更改屏幕颜色,另一个等待来自通信客户端的消息并更改屏幕色彩
将这些组合成一个正在进行的程序的最简单方法是什么,这样我们就可以等待屏幕或通信活动,这些活动可以按任何顺序出现
我尝试了在这个网站和其他网站上发现的关于线程和等待的各种方法,但似乎都不理想。如果有任何帮助,我将不胜感激!
# PROGRAM 1 - wait for user to click button
from tkinter import *
win1 = Tk()
win1.attributes('-fullscreen', True)
def turnorange():
win1.configure(bg='orange')
def turnwhite():
win1.configure(bg='white')
btn1 = Button( win1 , text='Click for orange' , command=turnorange)
btn1.place(x=100,y=100)
btn2 = Button( win1 , text='Click for white' , command=turnwhite)
btn2.place(x=250,y=100)
btn_end = Button( win1 , text='Close' , command=exit)
btn_end.place(x=200,y=200)
win1.mainloop()
# PROGRAM 2 - wait for message from client
from tkinter import *
import socket
win1 = Tk()
win1.attributes('-fullscreen', True)
def changecolour(col):
win1.configure(bg=col)
win1.update()
def startup():
ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ss.bind((socket.gethostname(), 8089))
ss.listen(5)
while True:
conn, address = ss.accept()
colour = conn.recv(64).decode()
if len(colour) > 0:
changecolour(colour)
data = 'whatever'
conn.send(data.encode())
btn = Button( win1 , text='Click to listen' , command=startup)
btn.place(x=100,y=100)
win1.mainloop()
当前代码的问题是启动被阻塞;您需要找到一种轮询新连接的方法,以便主循环能够继续监视其他事件。
试试这个套接字教程来了解基本知识,并通过这个问题了解使用非阻塞套接字的一些细节。
为了让套接字检查代码定期运行,请在之后检查tk。
这些链接让我深入了解了发生的事情,现在我已经解决了这个问题。
程序3结合了程序1和程序2,在我的笔记本电脑上运行。程序4在Windows平板电脑上运行。在程序3中,如果我们按下btn1或btn2,只有当我们与平板电脑连接时,它才会被处理,所以平板电脑只需要发送一条常规信息,比如每0.2秒发送一次:"a"将颜色变为青色,否则它会变为玉米淀粉。
这很管用,所以我很高兴。如果我能理解它是如何突破while True循环来处理事件的,我会更高兴!
from tkinter import *
# PROGRAM 3 on LAPTOP: wait for message from tablet OR for user to click button
import socket
win1 = Tk()
win1.attributes('-fullscreen', True)
def turnorange():
changecolour('orange')
def turnyellow():
changecolour('yellow')
def changecolour(col):
win1.configure(bg=col)
win1.update()
def startup():
ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ss.bind((socket.gethostname(), 8089))
ss.listen(5)
while True:
conn, address = ss.accept()
colour = conn.recv(64).decode()
if len(buf) > 0:
if buf == "A":
changecolour('cyan')
else:
changecolour('cornsilk')
data = 'whatever'
conn.send(data.encode())
btn = Button( win1 , text='Click to listen' , command=startup)
btn.place(x=100,y=100)
btn1 = Button( win1 , text='Click for orange' , command=turnorange)
btn1.place(x=300,y=100)
btn2 = Button( win1 , text='Click for yellow' , command=turnyellow)
btn2.place(x=400,y=100)
win1.mainloop()
# PROGRAM 4 on TABLET: sends message to laptop (a) when button clicked, and (b) every 0.2 seconds
from tkinter import *
import socket
win1 = Tk()
win1.attributes('-fullscreen', True)
def sendstuff(data):
cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cs.connect(('192.168.1.7', 8089))
cs.sendall(data.encode())
buf = cs.recv(64).decode()
cs.close()
def clicked():
sendstuff("A")
def sendroutine():
sendstuff("X")
win1.after(200, sendroutine) # time delay, 1000 =1 sec during test, 200 = 0.2 secs when live
btn1 = Button( win1 , text='Start' , command=sendroutine, width = 20, height = 3)
btn1.place(x=200,y=200)
btn2 = Button( win1 , text='Click for cyan' , command=clicked, width = 20, height = 3)
btn2.place(x=400,y=200)
win1.mainloop()