2010-02-07 7 views
0

J'utilise Python 3.1 en passant. J'essaie de créer une interface graphique simple en utilisant Tkinter - label, champ de saisie de texte, bouton sur la première ligne et zone de texte modifiable avec barre de défilement à droite et en bas - sur la deuxième ligne. S'il vous plaît aidez-moi à réparer la mise en page. Ce que j'ai ci-dessous ne fonctionne pas tout à fait. Si je dois utiliser une grille, je le ferai. Je souhaite garder le code très simple - je veux "vendre" Python à certains de mes collègues. Donc, je veux avoir un aspect et une sensation plutôt décents. Suggérez un meilleur rembourrage si cela ne vous dérange pas. Aussi, si mes noms de variable, etc. semblent bizarres, alors s'il vous plaît faites une note.Python 3.1 Aide à la mise en page Tkinter. Je suis proche, s'il vous plaît aidez-moi à finir cela

En même temps je veux faire semblant que c'est un script jetable sur lequel je n'ai pas passé beaucoup de temps. Puisque je demande votre aide, ce n'est pas le cas, mais ils n'ont pas besoin de savoir;). Donc, je ne veux pas introduire de code fantaisie pour créer de belles bordures, etc. Je veux juste quelque chose qui soit visuellement attrayant, propre et simple. Si je ne le fais pas, alors ma présentation n'atteindra pas son objectif.

Merci, mon code est ci-dessous:

class App: 
    def __init__(self, parent): 
     frame = Frame(parent) 
     self.__setup_gui(frame) # Call Helper 
     frame.pack(padx=15, pady=15) 
     parent.title('To be changed') 

    def __setup_gui(self, frame): 

     # First Row 
     self.cs_label = Label(frame, text='Change Set: ') 
     self.cs_label.pack(side=LEFT, padx=10, pady=10) 

     self.cs_val = Entry(frame, width=10) 
     self.cs_val.pack(side=LEFT, padx=10, pady=10) 

     self.get_button = Button(frame, text='Get', command=self.get_content) 
     self.get_button.pack(side=LEFT, padx=10, pady=10) 

     # Text area and scrollbar 
     self.text_area = Text(frame, height=10, width=50, background='white') 
     # Put a scroll bar in the frame 
     scroll = Scrollbar(frame) 
     self.text_area.configure(yscrollcommand=scroll.set) 
     self.text_area.pack(side=TOP) 
     scroll.pack(side=RIGHT,fill=Y) 

     self.clipboard_var = IntVar() 
     self.notepad_var = IntVar() 

    def get_content(self): 
     print(self.clipboard_var.get()) 
     print(self.notepad_var.get()) 

################################################################################################### 

if __name__ == '__main__': 
    root = Tk() 
    app = App(root) 
    root.mainloop() 

Répondre

2

Vous voulez certainement le gestionnaire du réseau - pack ne fonctionne que pour une stackup verticale ou horizontale par lui-même. Vous pouvez utiliser plusieurs cadres pour contourner ce problème, mais je trouve qu'il est plus facile de développer une interface graphique si vous le faites avec Grid pour commencer.

Voici ce que j'ai travaillé très rapidement basé sur ce que vous avez dit et le code. J'ai réduit/enlevé le rembourrage - il m'a semblé énorme - et j'ai mis en place deux barres de défilement, dans un sous-châssis pour que le rembourrage fonctionne plus facilement. Notez que pour rendre la barre de défilement horizontale utile, votre zone de texte doit avoir wrap = NONE; Sinon, vous pouvez aussi bien utiliser le widget facile 'ScrolledText' de tkinter.scrolledtext et ignorer la barre de défilement horizontale.

J'ai maintenant recadré les choses un peu pour permettre le redimensionnement, avec une taille minimale qui montre les boutons du haut - voir les utilisations de minsize et row/columnconfigure.

BTW, il semble que vos variables ne sont pas tirées de n'importe où - est-ce intentionnel?

from tkinter import * 

class App: 
    def __init__(self, parent): 
     self.__setup_gui(parent) # Call Helper 
     parent.title('To be changed') 

    def __setup_gui(self, parent): 

     # First Row 
     self.rowframe = Frame(parent) 
     self.rowframe.grid() 
     self.cs_label = Label(self.rowframe, text='Change Set: ') 
     self.cs_label.grid(row=0, column=0, padx=2, pady=2) 

     self.cs_val = Entry(self.rowframe, width=10) 
     self.cs_val.grid(row=0, column=1, padx=2, pady=2) 

     self.get_button = Button(self.rowframe, text='Get', command=self.get_content) 
     self.get_button.grid(row=0, column=2, padx=2, pady=2) 
     parent.update_idletasks() 
     parent.minsize(width=self.rowframe.winfo_width(), height=self.rowframe.winfo_height()) 

     # Text area and scrollbars 
     self.textframe = Frame(parent) 
     self.textframe.grid(row=1, columnspan=2, padx=2, pady=2, sticky=N+S+E+W) 

     self.hscroll = Scrollbar(self.textframe, orient=HORIZONTAL) 
     self.vscroll = Scrollbar(self.textframe) 
     self.text_area = Text(self.textframe, height=10, width=50, wrap=NONE, background='white', yscrollcommand=self.vscroll.set, xscrollcommand=self.hscroll.set) 
     self.text_area.grid(row=0, column=0, sticky=N+S+E+W) 
     self.hscroll.config(command=self.text_area.xview) 
     self.hscroll.grid(row=1, column=0, sticky=E+W) 
     self.vscroll.config(command=self.text_area.yview) 
     self.vscroll.grid(row=0, column=1, sticky=N+S) 

     # Row 0 defaults to 0 
     parent.rowconfigure(1, weight=1) 
     parent.columnconfigure(1, weight=1) 

     # Textarea setup 
     self.textframe.rowconfigure(0, weight=1) 
     self.textframe.columnconfigure(0, weight=1) 


     self.clipboard_var = IntVar() 
     self.notepad_var = IntVar() 

    def get_content(self): 
     print(self.clipboard_var.get()) 
     print(self.notepad_var.get()) 

################################################################################################### 

if __name__ == '__main__': 
    root = Tk() 
    app = App(root) 
    root.mainloop() 

Maintenant, tout ce que dit ... vous pourriez obtenir plus d'attrait visuel avec PyGTK, PyQt ou wxPython, bien tkinter venir « standard » est une fonctionnalité intéressante.

+0

Très cool! Maintenant, comment puis-je obtenir une barre de défilement en bas? –

+0

J'ai traversé et changé le code pour une barre de défilement horizontale aussi; Je devais revenir à l'utilisation de Text plutôt qu'à ScrolledText pour une apparence visuelle optimale, et pour la rendre utile, je devais régler wrap sur NONE. Vous trouverez peut-être les informations sur http://www.effbot.org/zone/tkinter-scrollbar-patterns.htm utiles pour d'autres fonctions de barre de défilement. –

+0

Votre solution a un mauvais comportement de redimensionnement. Vous devez inclure les appels à columnconfigure et rowconfigure, en indiquant les valeurs de pondération appropriées pour la ou les lignes et colonnes que vous souhaitez agrandir ou réduire. –