Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使我的功能不与其他功能同时工作?_Python_Tkinter - Fatal编程技术网

Python 如何使我的功能不与其他功能同时工作?

Python 如何使我的功能不与其他功能同时工作?,python,tkinter,Python,Tkinter,我正在尝试创建一个运气游戏,你必须在3扇门后拾取2个相同颜色的球,然后你尝试3次,每个门有1个球,我在你打开一扇门时被阻挡,我想在门显示球的那一刻和球消失的那一刻之间进行延迟。我已经尝试了时间。sleep但它在显示的时间运行sleep。这是我的密码: import tkinter as tk import tkinter as tk from random import shuffle import time fenetre = tk.Tk() fenetre['bg']='black' fen

我正在尝试创建一个运气游戏,你必须在3扇门后拾取2个相同颜色的球,然后你尝试3次,每个门有1个球,我在你打开一扇门时被阻挡,我想在门显示球的那一刻和球消失的那一刻之间进行延迟。我已经尝试了
时间。sleep
但它在显示的时间运行sleep。这是我的密码:

import tkinter as tk
import tkinter as tk
from random import shuffle
import time
fenetre = tk.Tk()
fenetre['bg']='black'
fenetre.geometry("1152x768")
color = ["red", "green", "yellow"]
shuffle(color)

frameGauche = tk.Frame(width=200, height=600, bg='pink')
frameGauche.grid(row=0, column=0, padx=10, pady=10)

frameDroite = tk.Frame(width=700, height=700, bg='grey')
frameDroite.grid(row=0, column=1, padx=10, pady=10)

portegauche=tk.Frame(frameDroite, width=200, 
height=600,bg='white',bd=5,relief='groove')
portegauche.grid(row=0, column=0, padx=5, pady=5)

portemilieu=tk.Frame(frameDroite, width=200, 
height=600,bg='white',bd=5,relief='groove')
portemilieu.grid(row=0, column=1, padx=5, pady=5)

portedroite=tk.Frame(frameDroite, width=200, 
height=600,bg='white',bd=5,relief='groove')
portedroite.grid(row=0, column=2, padx=5, pady=5)

def show1(canvas1, bouton2, bouton3):
    canvas1.grid(row=0, column=1)
    bouton2['state']='disabled'
    bouton3['state']='disabled'
    time.sleep(2)
    bouton2['state']='normal'
    bouton3['state']='normal'
    canvas1.grid_remove()
def show2():
    canvas2.grid(row=0, column=2)
    bouton1['state']='disabled'
    bouton3['state']='disabled'
    time.sleep(2)
    bouton1['state']='normal'
    bouton3['state']='normal'
    canvas2.grid_remove()
def show3():
    canvas3.grid(row=0, column=3)
    bouton2['state']='disabled'
    bouton1['state']='disabled'
    time.sleep(2)
    bouton2['state']='normal'
    bouton1['state']='normal'
    canvas3.grid_remove()

canvas1=tk.Canvas(portegauche,width=200, height=600, bg='white')
c1 = canvas1.create_oval((60,280), (140,340), width=1, outline="black", 
fill=color[0])
canvas1.grid_forget()

canvas2=tk.Canvas(portemilieu,width=200, height=600, bg='white')
c2 = canvas2.create_oval((60,280), (140,340), width=1, outline="black", 
fill=color[1])
canvas2.grid_forget()

canvas3=tk.Canvas(portedroite,width=200, height=600, bg='white')
c3 = canvas3.create_oval((60,280), (140,340), width=1, outline="black", 
fill=color[2])
canvas3.grid_forget()

def recommencer():
    canvas1.grid_remove()
    canvas2.grid_remove()
    canvas3.grid_remove()
    shuffle(color)
    canvas1.create_oval((60,280), (140,340), width=1, outline="black", fill=color[0])
    canvas2.create_oval((60,280), (140,340), width=1, outline="black", fill=color[1])
    canvas3.create_oval((60,280), (140,340), width=1, outline="black", fill=color[2])
    bouton1['state']='normal'
    bouton2['state']='normal'
    bouton3['state']='normal'

boutonR = tk.Button(frameGauche, text='Recommencer',command=recommencer)
boutonR.grid(row=0, column=0, padx=50, pady=50)

bouton1=tk.Button(frameDroite, text= 'Ouvrir',command=lambda: show1(canvas1, 
bouton2, bouton3))
bouton1.grid(row=1, column=0)

bouton2=tk.Button(frameDroite, text= 'Ouvrir',command=show2)
bouton2.grid(row=1, column=1)

bouton3=tk.Button(frameDroite, text= 'Ouvrir',command=show3)
bouton3.grid(row=1, column=2)

fenetre.mainloop()

如前所述,sleep()将冻结执行,在GUI编程中从来都不是一个好主意

为了实现这一点,请将showx函数分解为show和hide,下面是show1的示例。在这里,我们使用.after调用lambda函数(这使得传递参数更容易),第一个参数是.after的时间(以毫秒为单位)

def show1(canvas1, bouton2, bouton3):
    canvas1.grid(row=0, column=1)
    bouton2['state']='disabled'
    bouton3['state']='disabled'
    # OLD fenetre.after(2000, lambda: hide1(canvas1, bouton2, bouton3))
    # New thanks to Mike-SMT
    fenetre.after(2000, hide1, canvas1, bouton2, bouton3)

def hide1(canvas1, bouton2, bouton3):
    bouton2['state']='normal'
    bouton3['state']='normal'
    canvas1.grid_remove()
这是我从中得到的一些细节的答案

[编辑] 通过创建一个show和一个hide函数并将canvas/button对象作为参数传递,可以大大简化这一过程。从长远来看,为了简化这一过程,还需要进行更多的重构,但要开始使用.after()应该是您现在需要的

您可能希望删除文件顶部的双重导入

import tkinter as tk

如前所述,sleep()将冻结执行,在GUI编程中从来都不是一个好主意

为了实现这一点,请将showx函数分解为show和hide,下面是show1的示例。在这里,我们使用.after调用lambda函数(这使得传递参数更容易),第一个参数是.after的时间(以毫秒为单位)

def show1(canvas1, bouton2, bouton3):
    canvas1.grid(row=0, column=1)
    bouton2['state']='disabled'
    bouton3['state']='disabled'
    # OLD fenetre.after(2000, lambda: hide1(canvas1, bouton2, bouton3))
    # New thanks to Mike-SMT
    fenetre.after(2000, hide1, canvas1, bouton2, bouton3)

def hide1(canvas1, bouton2, bouton3):
    bouton2['state']='normal'
    bouton3['state']='normal'
    canvas1.grid_remove()
这是我从中得到的一些细节的答案

[编辑] 通过创建一个show和一个hide函数并将canvas/button对象作为参数传递,可以大大简化这一过程。从长远来看,为了简化这一过程,还需要进行更多的重构,但要开始使用.after()应该是您现在需要的

您可能希望删除文件顶部的双重导入

import tkinter as tk

主要问题是您使用了
sleep()
。在tkinter中睡眠将导致整个实例冻结,无法按预期工作。相反,您可以使用
after()

您还将导入tkinter两次。删除您为tkinter导入的一部分

也就是说,我们需要添加一个新函数,并在函数中更改几行

我添加了一个名为
normalize_button()
的函数,该函数为按钮名提供了一个参数。这与
after()
方法一起用于在2秒后更新按钮

在评论中回答您的问题:

函数
normalize_button()
在经过2秒后由
after()
方法调用。该方法检查传递给它的字符串,并将根据该字符串更新按钮。实际上,您可以使用show方法执行相同的操作,如果愿意,只需使用一个方法来更新所有按钮。它使事情变得更干净,并遵循干燥(不要重复自己)的PEP8风格

看看下面的代码

import tkinter as tk
from random import shuffle

fenetre = tk.Tk()
fenetre['bg']='black'
fenetre.geometry("1152x768")
color = ["red", "green", "yellow"]
shuffle(color)

frameGauche = tk.Frame(width=200, height=600, bg='pink')
frameGauche.grid(row=0, column=0, padx=10, pady=10)

frameDroite = tk.Frame(width=700, height=700, bg='grey')
frameDroite.grid(row=0, column=1, padx=10, pady=10)

portegauche=tk.Frame(frameDroite, width=200, 
height=600,bg='white',bd=5,relief='groove')
portegauche.grid(row=0, column=0, padx=5, pady=5)

portemilieu=tk.Frame(frameDroite, width=200, 
height=600,bg='white',bd=5,relief='groove')
portemilieu.grid(row=0, column=1, padx=5, pady=5)

portedroite=tk.Frame(frameDroite, width=200, 
height=600,bg='white',bd=5,relief='groove')
portedroite.grid(row=0, column=2, padx=5, pady=5)

def normalize_button(btn_name):
    print(btn_name)
    if btn_name == "b1":
        bouton1['state']='normal'
    if btn_name == "b2":
        bouton2['state']='normal'
    if btn_name == "b3":
        bouton3['state']='normal'

def show1():
    canvas1.grid(row=0, column=1)
    bouton2['state']='disabled'
    bouton3['state']='disabled'
    fenetre.after(2000, normalize_button, "b2")
    fenetre.after(2000, normalize_button, "b3")
    fenetre.after(2000, canvas1.grid_forget)

def show2():
    canvas2.grid(row=0, column=2)
    bouton1['state']='disabled'
    bouton3['state']='disabled'
    fenetre.after(2000, normalize_button, "b1")
    fenetre.after(2000, normalize_button, "b3")
    fenetre.after(2000, canvas2.grid_forget)

def show3():
    canvas3.grid(row=0, column=3)
    bouton2['state']='disabled'
    bouton1['state']='disabled'
    fenetre.after(2000, normalize_button, "b2")
    fenetre.after(2000, normalize_button, "b1")
    fenetre.after(2000, canvas3.grid_forget)

canvas1 = tk.Canvas(portegauche,width=200, height=600, bg='white')
c1 = canvas1.create_oval((60,280), (140,340), width=1, outline="black", fill=color[0])
canvas1.grid_forget()

canvas2 = tk.Canvas(portemilieu,width=200, height=600, bg='white')
c2 = canvas2.create_oval((60,280), (140,340), width=1, outline="black", fill=color[1])
canvas2.grid_forget()

canvas3 = tk.Canvas(portedroite,width=200, height=600, bg='white')
c3 = canvas3.create_oval((60,280), (140,340), width=1, outline="black", fill=color[2])
canvas3.grid_forget()

def recommencer():
    canvas1.grid_remove()
    canvas2.grid_remove()
    canvas3.grid_remove()
    shuffle(color)
    canvas1.create_oval((60,280), (140,340), width=1, outline="black", fill=color[0])
    canvas2.create_oval((60,280), (140,340), width=1, outline="black", fill=color[1])
    canvas3.create_oval((60,280), (140,340), width=1, outline="black", fill=color[2])
    bouton1['state']='normal'
    bouton2['state']='normal'
    bouton3['state']='normal'

boutonR = tk.Button(frameGauche, text='Recommencer',command=recommencer)
boutonR.grid(row=0, column=0, padx=50, pady=50)

bouton1=tk.Button(frameDroite, text= 'Ouvrir',command=show1)
bouton1.grid(row=1, column=0)

bouton2=tk.Button(frameDroite, text= 'Ouvrir',command=show2)
bouton2.grid(row=1, column=1)

bouton3=tk.Button(frameDroite, text= 'Ouvrir',command=show3)
bouton3.grid(row=1, column=2)

fenetre.mainloop()

主要问题是您使用了
sleep()
。在tkinter中睡眠将导致整个实例冻结,无法按预期工作。相反,您可以使用
after()

您还将导入tkinter两次。删除您为tkinter导入的一部分

也就是说,我们需要添加一个新函数,并在函数中更改几行

我添加了一个名为
normalize_button()
的函数,该函数为按钮名提供了一个参数。这与
after()
方法一起用于在2秒后更新按钮

在评论中回答您的问题:

函数
normalize_button()
在经过2秒后由
after()
方法调用。该方法检查传递给它的字符串,并将根据该字符串更新按钮。实际上,您可以使用show方法执行相同的操作,如果愿意,只需使用一个方法来更新所有按钮。它使事情变得更干净,并遵循干燥(不要重复自己)的PEP8风格

看看下面的代码

import tkinter as tk
from random import shuffle

fenetre = tk.Tk()
fenetre['bg']='black'
fenetre.geometry("1152x768")
color = ["red", "green", "yellow"]
shuffle(color)

frameGauche = tk.Frame(width=200, height=600, bg='pink')
frameGauche.grid(row=0, column=0, padx=10, pady=10)

frameDroite = tk.Frame(width=700, height=700, bg='grey')
frameDroite.grid(row=0, column=1, padx=10, pady=10)

portegauche=tk.Frame(frameDroite, width=200, 
height=600,bg='white',bd=5,relief='groove')
portegauche.grid(row=0, column=0, padx=5, pady=5)

portemilieu=tk.Frame(frameDroite, width=200, 
height=600,bg='white',bd=5,relief='groove')
portemilieu.grid(row=0, column=1, padx=5, pady=5)

portedroite=tk.Frame(frameDroite, width=200, 
height=600,bg='white',bd=5,relief='groove')
portedroite.grid(row=0, column=2, padx=5, pady=5)

def normalize_button(btn_name):
    print(btn_name)
    if btn_name == "b1":
        bouton1['state']='normal'
    if btn_name == "b2":
        bouton2['state']='normal'
    if btn_name == "b3":
        bouton3['state']='normal'

def show1():
    canvas1.grid(row=0, column=1)
    bouton2['state']='disabled'
    bouton3['state']='disabled'
    fenetre.after(2000, normalize_button, "b2")
    fenetre.after(2000, normalize_button, "b3")
    fenetre.after(2000, canvas1.grid_forget)

def show2():
    canvas2.grid(row=0, column=2)
    bouton1['state']='disabled'
    bouton3['state']='disabled'
    fenetre.after(2000, normalize_button, "b1")
    fenetre.after(2000, normalize_button, "b3")
    fenetre.after(2000, canvas2.grid_forget)

def show3():
    canvas3.grid(row=0, column=3)
    bouton2['state']='disabled'
    bouton1['state']='disabled'
    fenetre.after(2000, normalize_button, "b2")
    fenetre.after(2000, normalize_button, "b1")
    fenetre.after(2000, canvas3.grid_forget)

canvas1 = tk.Canvas(portegauche,width=200, height=600, bg='white')
c1 = canvas1.create_oval((60,280), (140,340), width=1, outline="black", fill=color[0])
canvas1.grid_forget()

canvas2 = tk.Canvas(portemilieu,width=200, height=600, bg='white')
c2 = canvas2.create_oval((60,280), (140,340), width=1, outline="black", fill=color[1])
canvas2.grid_forget()

canvas3 = tk.Canvas(portedroite,width=200, height=600, bg='white')
c3 = canvas3.create_oval((60,280), (140,340), width=1, outline="black", fill=color[2])
canvas3.grid_forget()

def recommencer():
    canvas1.grid_remove()
    canvas2.grid_remove()
    canvas3.grid_remove()
    shuffle(color)
    canvas1.create_oval((60,280), (140,340), width=1, outline="black", fill=color[0])
    canvas2.create_oval((60,280), (140,340), width=1, outline="black", fill=color[1])
    canvas3.create_oval((60,280), (140,340), width=1, outline="black", fill=color[2])
    bouton1['state']='normal'
    bouton2['state']='normal'
    bouton3['state']='normal'

boutonR = tk.Button(frameGauche, text='Recommencer',command=recommencer)
boutonR.grid(row=0, column=0, padx=50, pady=50)

bouton1=tk.Button(frameDroite, text= 'Ouvrir',command=show1)
bouton1.grid(row=1, column=0)

bouton2=tk.Button(frameDroite, text= 'Ouvrir',command=show2)
bouton2.grid(row=1, column=1)

bouton3=tk.Button(frameDroite, text= 'Ouvrir',command=show3)
bouton3.grid(row=1, column=2)

fenetre.mainloop()

sleep()
不应该在tkinter中使用。改用
after()
。睡眠将导致整个实例冻结。
Sleep()
不应在tkinter中使用。改用
after()
。睡眠将导致整个实例冻结。您的隐藏功能不完整。您好@Mike SMT,我不确定在什么意义上,请帮助我改进我的答案,鉴于原始代码似乎可以满足需要,但我告诉您,您的答案更详细、更好。没关系。我知道你现在在做什么。但是,这里不需要lambda。相反,你可以这样做
fenetre.after(2000,hide1,canvas1,bouton2,bouton3)
。我同意这可以减少,实际上这可以减少到只有一个函数,它接受一些参数,然后根据这些参数执行显示和隐藏命令。你的隐藏函数不完整。Hi@Mike SMT,我不确定在什么意义上,请帮助我改进我的答案,鉴于原始代码它似乎做什么是需要的,但我给你,你的答案是更详细和更好的一个。没关系。我知道你现在在做什么。但是,这里不需要lambda。相反,你可以这样做
fenetre.after(2000,hide1,canvas1,bouton2,bouton3)
。我同意这可以减少,实际上这可以减少到只有一个函数,它接受一些参数,然后根据这些参数执行显示和隐藏命令。谢谢,它工作得很好,但是你能给我解释一下“normalize\u”按钮吗部分请?@JimmyFish我在“规格化”函数的解释中添加了一些更详细的内容。@JimmyFish请花点时间选择该答案旁边的复选标记