J'ai deux soucis avec un petit programme que je viens de finir.
Premier problème :
from tkinter import *
from tkinter.ttk import *
class View(object):
"""Classe de GUI"""
def __init__(self):
self.root= Tk()
frame = Frame(self.root)
frame.pack()
self.root.title("OleLink")
self.message = Text(frame, width=40, height=10, wrap=WORD)
self.browse = Button(frame,
text="Fichier à traiter", width=15,
command=self.load_file)
self.traiter = Button(frame,
text="Lancer", width=15,
)
self.message.grid(row=0, column=0, columnspan=2)
self.browse.grid(row=1, column=0, sticky='w')
self.traiter.grid(row=1, column=1, sticky="e")
def load_file(self) :
fname = filedialog.askopenfilename(filetypes=(("Excel", "*.xls;*.xlsx"),
("All files", "*.*") ))
if fname:
try:
print(fname)
except:
messagebox.showerror("Open Source File", "Failed to read file\n'%s'" % fname)
return
if __name__ == "__main__" :
### or nothing
#root.style = Style()
#root.style.theme_use("clam")
###
app = View()
app.root.resizable(0,0)
app.root.mainloop()
Ce code s'exécute parfaitement dans IDLE, lorsque je presse F5.
Lorsque je le lance directement en cliquant dessus, en revanche, cette erreur apparait :
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
return self.func(*args)
File "D:\Code\Python\Coala\oview.py", line 26, in load_file
fname = filedialog.askopenfilename(filetypes=(("Excel", "*.xls;*.xlsx"),
NameError: name 'filedialog' is not defined
C'est incompréhensible pour moi.
Le second problème est tout aussi étrange.
import subprocess, sys
class Olelink(object) :
def __init__(self) :
self.exe = "core.exe"
self.v = View()
self.v.root.resizable(0,0)
def getPort(self) :
"""Renvoi le port écouté sur localhost du programme exe"""
encoding = sys.stdout.encoding #encodage de la console
#on trouve le pid du programme
pid = subprocess.check_output("tasklist /fo csv", shell=True).decode(encoding).split("\r\n")
#mise en forme
pid = [x.replace('"','').split(",")[0:2] for x in pid]
#on vérifie que le programme est bien lancé
try :
pid = [x for x in pid if x[0] == self.exe][0][1]
except :
print("Coala n'est pas lancé")
sys.exit()
#on récupère le port
net = subprocess.Popen("netstat -ano", stdout=subprocess.PIPE, shell=True)
find = subprocess.check_output("findstr "+str(pid), stdin=net.stdout, shell=True)
net.stdout.close()
net = find.decode(encoding).split("\r\n")
#mise en forme
ports = []
for x in net :
if x != "" :
z = x.strip().split(" ")
z = [y for y in z if y != ""]
ports.append(z)
#on récupère l'adresse du serveur OLE
port = False
for x in ports :
if "127.0.0.1" in x[1] :
port = x[1]
#on vérifie que le serveur OLE est bien lancé
if port :
print("Serveur Ole détecté")
return port
else :
print("Ole non initialisé, attendez et relancez")
sys.exit()
if __name__ == "__main__" :
app = Olelink()
app.getPort()
app.v.root.mainloop()
Ce programme se lance correctement au double-clic, aucune console n'apparait comme je le souhaite.
Cependant, si je le lance en mode *.pyw, plus rien ne se passe. Mon interface graphique ne se lance pas.