Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Tkinter, console et IDLE

+3 votes

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.

demandé 9-Jul-2015 par Zara (200 points)

1 Réponse

+2 votes
 
Meilleure réponse
NameError: name 'filedialog' is not defined

Signifie qu'il essaye d'utiliser la variable filedialog mais qu'il ne la trouve pas. Fais en début de fichier :

from tkinter import filedialog

D'une manière générale, n'utilise pas "import *" en dehors du shell, car tu ne sais pas tout ce que ça importe. Fait des imports explicites, c'est à dire en donnant à la main le nom de tout ce que tu importes.

Pour le deuxième problème, ouvre une question séparée : une question par problème, sinon on va tout mélanger.

répondu 10-Jul-2015 par Sam (5,000 points)
sélectionné 10-Jul-2015 par Zara

Effectivement ça fonctionne !

from tkinter import Tk, Frame, Button, Text, WORD, filedialog

C'est étrange comme comportement tout de même.
Merci beaucoup en tout cas !

...