J'ai décidé de créer une application graphique avec Python, et l'utilisation de Tkinter a été rapide, c'est donc un mémorandum pour la prochaine utilisation.
import Tkinter as Tk
class Application(Tk.Frame):
def __init__(self, master=None):
Tk.Frame.__init__(self, master)
self.pack()
root = Tk.Tk()
app = Application(master=root)
app.mainloop()
Divers widgets seront joints ici.
Widget[^1]
Nom | rôle |
---|---|
Button | bouton |
Canvas | Coller et dessiner des images |
Checkbutton | Bouton de vérification |
Entry | Zone de texte sur une ligne. Plusieurs lignes sont du texte |
Frame | Un cadre qui rassemble d'autres widgets |
Label | étiquette. Les images peuvent également être affichées |
Listbox | zone de liste |
Menu | Créer une barre de menus |
Message | Étiquette multiligne |
OptionMenu | boîte combo |
Radiobutton | Boutons radio |
Scale | glissière |
Scrollbar | barre de défilement |
Text | Zone de texte multiligne |
Toplevel | Pour créer des fenêtres pop-up, etc. |
[^ 1]: tous ne sont pas couverts
Utilisez l'une des méthodes pack, place et grid pour placer le widget. pack organise les widgets dans une colonne ou une ligne. place spécifie l'emplacement de chaque widget et le place. grid organise les widgets sur des coordonnées 2D (cela ressemble à du papier quadrillé Excel). Après cela, nous utilisons essentiellement la grille.
def __init__(self, master=None):
#réduction
self.create_widgets()
def create_widgets(self):
self.label = Tk.Label(self, text=u'Fichier d'entrée')
self.entry = Tk.Entry(self)
self.button = Tk.Button(self, text=u'ouvert')
self.check = Tk.Checkbutton(self, text=u'Extension limitée à txt')
self.text = Tk.Text(self)
self.label.grid(column=0, row=0)
self.entry.grid(column=1, row=0)
self.button.grid(column=2, row=0)
self.check.grid(column=0, row=1)
self.text.grid(column=0, columnspan=3, row=2)
Tout d'abord, définissez développer, remplir et ancrer pour rendre le cadre parent compatible avec l'expansion et la contraction. La position de Tk.XX qui apparaît avec l'ancre et le collant décrit plus loin peut être spécifiée par nord, sud, est et ouest (NSEW).
def __init__(self, master=None):
Tk.Frame.__init__(self, master)
self.pack(expand=1, fill=Tk.BOTH, anchor=Tk.NW)
self.create_widgets()
Ensuite, lors de l'organisation de chaque widget avec une grille, spécifiez où et comment développer et contracter avec sticky. Une autre chose importante est que lorsque vous placez un widget avec une grille, vous devez spécifier quelle ligne / colonne se développe et se contracte à quel rapport avec la configuration de la colonne et la configuration de la ligne. Par défaut, le paramètre de poids est 0 (ne s'étire pas), il vous suffit donc de définir le poids de la ligne / colonne que vous souhaitez étirer sur 1. Dans l'exemple ci-dessous, seule la deuxième ligne avec Texte correspond à l'expansion et à la contraction de la première colonne avec Entrée, qui est censée contenir le nom de fichier sélectionné.
self.label.grid(column=0, row=0, sticky=Tk.W)
self.entry.grid(column=1, row=0, sticky=Tk.EW)
self.button.grid(column=2, row=0, sticky=Tk.E)
self.check.grid(column=0, columnspan=2, row=1, sticky=Tk.W)
self.text.grid(column=0, columnspan=3, row=2, sticky=Tk.NSEW)
self.columnconfigure(1, weight=1)
self.rowconfigure(2, weight=1)
Le contenu de Entry et le statut de contrôle de Checkbutton peuvent être obtenus en définissant une variable dans l'option (texte) variable.
self.var_entry = Tk.StringVar()
self.entry = Tk.Entry(self, textvariable=self.var_entry)
self.var_check = Tk.BooleanVar()
self.check = Tk.Checkbutton(self, text=u'Extension limitée à txt',
variable=self.var_check)
Utilisez set () et get () pour définir et obtenir les valeurs de Tk.StringVar () et Tk.BooleanVar ().
La méthode à exécuter lorsque le bouton est enfoncé est spécifiée par l'option de commande.
def create_widgets(self):
self.var_entry = Tk.StringVar()
self.entry = Tk.Entry(self, textvariable=self.var_entry)
self.button = Tk.Button(self, text=u'ouvert', command=self.button_pushed)
def button_pushed(self):
self.var_entry.set(u'Le bouton a été enfoncé.')
Pour ouvrir la boîte de dialogue de fichier, importez tkFileDialog et utilisez askopenfilename. Vous pouvez spécifier le type de fichier à l'aide de l'option filetypes. De plus, tkFileDialog inclut askopenfile, askopenfiles, askopenfilenames, askaveasfile, askaveasfilename, askdirectory, etc.
import tkFileDialog as tkFD
def button_pushed(self):
ft = [('text files', '.txt')] if self.var_check.get() else []
self.var_entry.set(tkFD.askopenfilename(filetypes=ft))
Pour surveiller une variable et appeler une méthode lorsqu'elle change, utilisez la méthode trace.
def create_widgets(self):
self.var_entry = Tk.StringVar()
self.var_entry.trace('w', self.entry_changed)
def entry_changed(self, *args):
if os.path.exists(self.var_entry.get()):
self.text.delete('1.0', Tk.END)
self.text.insert('1.0', open(self.var_entry.get()).read())
entry_changed est appelé lorsque la valeur de var_entry est réécrite. Tout d'abord, effacez tout le contenu de Texte, puis affichez le contenu du fichier.
Vous pouvez ajouter une barre de défilement au texte. [^ 2] Il semble y avoir un widget appelé ScrolledText qui a une barre de défilement verticale depuis le début.
self.text = Tk.Text(self, wrap=Tk.NONE)
self.yscroll = Tk.Scrollbar(self, command=self.text.yview)
self.xscroll = Tk.Scrollbar(self, command=self.text.xview,
orient=Tk.HORIZONTAL)
self.text['yscrollcommand'] = self.yscroll.set
self.text['xscrollcommand'] = self.xscroll.set
self.text.grid(column=0, columnspan=3, row=2, rowspan=2, sticky=Tk.NSEW)
self.yscroll.grid(column=2, row=2, sticky=Tk.NS + Tk.E)
self.xscroll.grid(column=0, columnspan=3, row=3, sticky=Tk.EW + Tk.S)
[^ 2]: L'intersection des barres de défilement, j'ai l'impression de pouvoir en faire un peu plus
Il semble que Tkinter assume fondamentalement le gif. D'un autre côté, par exemple, savefig de matplotlib (pyplot) ne peut pas enregistrer les images au format gif (n'est-ce pas?). Je l'ai donc converti comme suit, puis je l'ai collé, mais y a-t-il un moyen plus intelligent?
from PIL import Image
def create_widgets(self):
self.canvas = Tk.Canvas(self)
self.canvas.grid(column=0, columnspan=3, row=4, sticky=Tk.NSEW)
def set_image(self):
img = Image.open('foo.png')
img.save('_tmp.gif')
self.image_data = Tk.PhotoImage(file='_tmp.gif')
self.canvas.create_image(200, 100, image=self.image_data)
Ceci est une copie de stackoverflow. .. .. Vous pouvez exporter le contenu de la sortie standard vers Texte, etc.
import sys
def __init__(self, master=None):
Tk.Frame.__init__(self, master)
self.pack(expand=1, fill=Tk.BOTH, anchor=Tk.NW)
self.create_widgets()
sys.stdout = self.StdoutRedirector(self.text)
sys.stderr = self.StderrRedirector(self.text)
class IORedirector(object):
def __init__(self, text_area):
self.text_area = text_area
class StdoutRedirector(IORedirector):
def write(self, st):
self.text_area.insert(Tk.INSERT, st)
class StderrRedirector(IORedirector):
def write(self, st):
self.text_area.insert(Tk.INSERT, st)
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
Il semble que Tkinter a été renommé en tkinter et tkFileDialog a été renommé en fileialog.
Recommended Posts