tkinter 运行不出来,不知道哪里的问题
下面 是代码"""
---------------------------------
test: rzbbzr
test1: PyCharm
test2: 2222.py
test3: 2022-03-02 10:31
Pyinstaller -F2222.py
py转jupyter %load xxxx.py
pip install -i https://pypi.doubanio.com/simple/ 包名
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple +包名
"""
import time
import tkinter as tk
import keyboard
st = tk.Tk()
st.geometry("500x300")
def bk():
st.destroy()
start_button = tk.Button(text='开始游戏', command=bk, font=(None, 15), width=10, heigh=3)
rule = tk.Label(text='开始后,按下空格键,\n等待3秒再按键,两次间隔等于3秒获胜', font=(None, 20))
rule.pack()
start_button.place(x=200, y=200)
tk.mainloop()
begin = tk.Tk()
begin.geometry("500x300")
t = tk.StringVar()
_time = tk.Label(textvariable=t, font=(None, 50))
_time.pack()
hd = False
ab = False
def do():
keyboard.clear_hotkey('space')
keyboard.add_hotkey('space', do_)
global t1
t1 = time.time()
begin_time = 3.00
begin_time = float(format(begin_time, ".2f"))
for i in range(300):
begin_time -= 0.01
begin_time = float(format(begin_time, ".2f"))
t.set(begin_time)
time.sleep(0.01)
if not hd:
lose = tk.Label(text='你失败了', font=(None, 50))
lose.pack()
def do_():
global t2
t2 = time.time()
if float(format(t1, ".2f")) - float(format(t2, ".2f")) == 3.00:
tk.Label(text='成功!', font=(None, 20)).pack()
else:
lose = tk.Label(text='你失败了', font=(None, 50))
lose.pack()
hd = True
keyboard.add_hotkey('space', do)
begin.mainloop()
谢谢 本帖最后由 isdkz 于 2022-3-2 13:59 编辑
因为上一次热键的动作没有执行完,所以它不会检测下一次热键被按下,
这种情况你可以使用多线程,因为多线程是非阻塞的,热键被按下开启一个线程就完事了,可以直接返回,
这样就能检测下一次热键被按下了,故对你的代码修改如下:
"""
---------------------------------
test: rzbbzr
test1: PyCharm
test2: 2222.py
test3: 2022-03-02 10:31
Pyinstaller -F2222.py
py转jupyter %load xxxx.py
pip install -i https://pypi.doubanio.com/simple/ 包名
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple +包名
"""
import time
import tkinter as tk
import keyboard
from threading import Thread
st = tk.Tk()
st.geometry("500x300")
def bk():
st.destroy()
start_button = tk.Button(text='开始游戏', command=bk, font=(None, 15), width=10, heigh=3)
rule = tk.Label(text='开始后,按下空格键,\n等待3秒再按键,两次间隔等于3秒获胜', font=(None, 20))
rule.pack()
start_button.place(x=200, y=200)
tk.mainloop()
begin = tk.Tk()
begin.geometry("500x300")
t = tk.StringVar()
_time = tk.Label(textvariable=t, font=(None, 50))
_time.pack()
hd = False
ab = False
flag = True # 加个 flag 个标志来设置 热键 的动作
def do_1():
global t1, flag # 需要在函数里转换 flag 标志的状态
flag = False
t1 = time.time()
begin_time = 3.00
begin_time = float(format(begin_time, ".2f"))
for i in range(300):
if flag:
return
begin_time -= 0.01
begin_time = float(format(begin_time, ".2f"))
t.set(begin_time)
time.sleep(0.01)
if not hd:
lose = tk.Label(text='你失败了', font=(None, 50))
lose.pack()
def do_2():
global t2, flag # 需要在函数里转换 flag 标志的状态
flag = True
t2 = time.time()
if float(format(t1, ".2f")) - float(format(t2, ".2f")) == 3.00:
tk.Label(text='成功!', font=(None, 20)).pack()
else:
lose = tk.Label(text='你失败了', font=(None, 50))
lose.pack()
hd = True
def do():
global th
if flag:
th = Thread(target=do_1) # 使用线程,因为线程是非阻塞的
th.start()
else:
do_2()
keyboard.add_hotkey('space', do)
begin.mainloop() isdkz 发表于 2022-3-2 13:57
因为上一次热键的动作没有执行完,所以它不会检测下一次热键被按下,
这种情况你可以使用多线程,因为多 ...
st = tk.Tk()
begin = tk.Tk()
他这个程序 怎么两个这个,
一般的程序不就一个的吗 本帖最后由 isdkz 于 2022-3-2 19:37 编辑
swanseabrian 发表于 2022-3-2 18:59
st = tk.Tk()
begin = tk.Tk()
st 是游戏前的提示界面,也就是那个有开始游戏按钮的界面,
begin是游戏界面,也就是那个监听 空格 的界面,
按下开始游戏后,st 界面销毁才进入了 begin 界面,所以也就是说这两个界面也是只同时存在一个,
不过同时打开多个主界面也是没有问题的 swanseabrian 发表于 2022-3-2 18:59
st = tk.Tk()
begin = tk.Tk()
st = tk.Tk()
这个tk里的所有东西我可以看懂, 按完那个button不是这个窗口销毁了吗,为啥没执行完? isdkz 发表于 2022-3-2 13:57
因为上一次热键的动作没有执行完,所以它不会检测下一次热键被按下,
这种情况你可以使用多线程,因为多 ...
从哪里看出来没执行完,我没看出来........ swanseabrian 发表于 2022-3-2 21:37
从哪里看出来没执行完,我没看出来........
你那个 do函数 不是一直在倒计时吗?只要倒计时没完函数也就没有执行完,
所以你那个得等倒计时完才会检测新的空格事件 isdkz 发表于 2022-3-2 21:40
你那个 do函数 不是一直在倒计时吗?只要倒计时没完函数也就没有执行完,
所以你那个得等倒计时完才 ...
我去,你改了这么大,厉害 本帖最后由 isdkz 于 2022-3-2 22:14 编辑
swanseabrian 发表于 2022-3-2 22:06
我去,你改了这么大,厉害
嘻嘻,谢谢夸奖,我改的主要是倒计时那个函数我把它放在线程里,
因为开启线程后可以直接返回的,不用阻塞在那个函数里面,
还有就加了个flag标志,用来控制倒计时的那个线程停止,
以及决定 空格热键 执行哪个函数 isdkz 发表于 2022-3-2 13:57
因为上一次热键的动作没有执行完,所以它不会检测下一次热键被按下,
这种情况你可以使用多线程,因为多 ...
def do():
keyboard.clear_hotkey('space')
keyboard.add_hotkey('space', do_)
global t1
这个直接用t1不行吗, 为什么加个global? swanseabrian 发表于 2022-3-2 22:24
def do():
keyboard.clear_hotkey('space')
因为他需要在另一个函数用到 t1,局部变量是不能让另一个函数访问到的,
所以得声明成全局变量。 isdkz 发表于 2022-3-2 22:54
因为他需要在另一个函数用到 t1,局部变量是不能让另一个函数访问到的,
所以得声明成全局变量。
java会吗, 我还得学下java swanseabrian 发表于 2022-3-3 09:33
java会吗, 我还得学下java
会
页:
[1]