Bonjour
J'aimerai changer l'état d'une variable (de False a True) a l'aide d'un bouton.
Cordialement.
Version imprimable
Bonjour
J'aimerai changer l'état d'une variable (de False a True) a l'aide d'un bouton.
Cordialement.
mavar est un booleen = vrai // clic sur bouton btn_changer si mavar = vrai alors mavar= faux sinon mavar=vrai fin
J'ai écrit ceci cela ne change rien quand j'appuie sur mon bouton
voici le message d'erreurCode:
1
2 if portouvert == False: portouvert = True
Citation:
if portouvert == False: UnboundLocalError: local variable 'portouvert' referenced before assignment
Salut,
Cliquer sur un Button appelle un "callback" qui est, à priori, une fonction et si la variable portouvert n'a pas une durée de vie plus grande que la fonction impossible de la modifier suivant son état courant (elle n'existe pas en dehors de la fonction).
Lorsqu'on débute, on utilise des variables globales (dans ce cas là).
- W
Voici mon code dans connexion j'aimerai changer la variables.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 # -*-coding:Utf-8 -* from tkinter import * import serial import time ser = serial.Serial() ser.baudrate = 115200 ser.port = 'COM10' #Commande portouvert = False def monter(): ser.write(b'G91\n') ser.write(b'G1 Z10.000 F1200\n') ser.write(b'G90\n') def descend(): ser.write(b'G91\n') ser.write(b'G1 Z-10.000 F1200\n') ser.write(b'G90\n') def demande_temp(): ser.write(b'M105\n') data = ser.readline() if data.startswith(b'ok T'): print(data) texte_temp.set("Temperature Extrudeuse : "+str(data[5:10])) while(portouvert == True): ser.write(b'M105\n') data = ser.readline() texte_temp.set("Temperature Extrudeuse : "+str(data[5:10])) if data.startswith(b'ok T'): print(data) def connexion(): ser.open() if portouvert == False: portouvert = True def deconnexion(): ser.close() portouvert = False #GUI root=Tk() root.title("Imprimante 3D") root.geometry("800x480") root.minsize(480, 260) root.config(background='#C9C3AB') #frame frpr = Frame(root, bg='#C9C3AB') frpr.pack(expand=YES) frcon = LabelFrame(frpr, text="Connexction", padx=20, pady=20) frcon.pack(fill="both", expand="yes") frtemp = LabelFrame(frpr, text="Température", padx=20, pady=20) frtemp.pack(fill="both", expand="yes") #Bp, Label, ... #frpr bp_10 = Button(frpr, text="10", font=("Courrier", 14),command=monter,bg='white',fg='#C9C3AB') bp_10.pack(pady=5,fill=X) b_10 = Button(frpr, text="-10", font=("Courrier", 14),command=descend,bg='white',fg='#C9C3AB') b_10.pack(pady=5,fill=X) s = Spinbox(frpr, from_=0, to=300) s.pack() #frcon bpconnexion = Button(frcon, text="Connecter", font=("Courrier", 14),command=connexion,bg='white',fg='#C9C3AB') bpconnexion.pack(pady=5,fill=X) bpdeconnexion = Button(frcon, text="Déconnecter", font=("Courrier", 14),command=deconnexion,bg='white',fg='#C9C3AB') bpdeconnexion.pack(pady=5,fill=X) #frtemp bptemp = Button(frtemp, text="Temperature", font=("Courrier", 14),command=demande_temp,bg='white',fg='#C9C3AB') bptemp.pack(pady=5,fill=X) texte_temp = StringVar() texte_temp.set("Température Extrudeuse : ") label_temp = Label(frtemp, textvariable=texte_temp, bg="grey") label_temp.pack(pady=5,fill=X) root.mainloop()
Salut,
Votre variable ne sert à rien puisque vous avez déjà ser auquel vous pouvez appliquer les méthode .open, .close et tester l'état via .is_open (voir la documentation de serial).
Si vous tenez à gérer l'état du port dans une variable à part, il faut apprendre à utiliser les variables globales (et ouvrir un tuto., dans le Swinnen, c'est ce chapitre).
- W
C'est vous qui programmez, donc vous avez pris soin de reproduire chez vous l'exemple donné dans la documentation pour vérifier que vous êtes capable de le faire fonctionner et qu'il fonctionne.
Si ser.is_open() sort un message d'erreur, il serait bon de l'indiquer (et de poster le code que vous avez réalisé)..
Mais ce message devrait quand même vous être familier car vous l'avez certainement rencontré lorsque vous avez fait les exercices proposés dans votre tuto. favori.
Ceci dit, comme on espère que les exemples de la documentation fonctionnent, une erreur devrait vous inciter à relire le code de l'exemple pour vérifier que vous avez bien tapé la même chose.
- W
Si vous avez déjà écrit des fonctions comme:
difficile de savoir quelle difficulté vous rencontrez.Code:
1
2
3
4
5
6 def demande_temp(): ser.write(b'M105\n') data = ser.readline() if data.startswith(b'ok T'): print(data) texte_temp.set("Temperature Extrudeuse : "+str(data[5:10]))
Surtout si vous ne postez pas le code que vous avez essayé de faire et que vous ne cherchez pas à comprendre pourquoi Python n'en veut pas.
note: programmer, c'est comme tout: on fait des erreurs, on essaie de comprendre pourquoi et on corrige.
- W
Il faut peut-être penser d'une manière un peu différente avec ser.is_open
Par exemple,
deviendraitCode:
1
2
3
4 def connexion(): ser.open() if portouvert == False: portouvert = True
Code:
1
2
3 def connexion(): if not ser.is_open(): ser.open()