UI

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
greinar
User
Beiträge: 7
Registriert: Dienstag 28. Januar 2014, 15:47

Ich habe nunmehr zwei Jahre an einem FOSS Projekt mitgearbeitet. Ich bin allerdings kein Programmierer, habe mir aber im Laufe der Zeit etwas Python angeeignet und damit auch mehrere für mich hilfreiche Scripte erstellt. Nun wird das langsam sehr unübersichtlich, daher will ich versuchen, diese Sammlung über eine GUI zugänglich zu machen. Ich muss allerdings zugeben, das ich hier auch an gewisse Grenzen stosse. Ohne Hilfe wird daraus wohl nix.
Das wäre nicht wirklich schlimm, ich will letztendlich nicht umsatteln. Aber irgendwie reizt mich die Sache schon. Also habe ich versucht, den Ansatz eines Hauptmenüs zu erstellen, von dem aus über Buttons separate Fenster für die jeweiligen Untermenüs aufgerufen werden sollen.
Die Frage wäre also, ob mein Anfang so in Ordnung geht, bzw. was ich ändern/beachten/verbessern muss. Ausserdem wäre ich dankbar für einen Hinweis, wie ich den Titel des Fensters einstellen kann.

Code: Alles auswählen

#! /usr/bin/env phyton
# -*- coding: utf-8 -*-

import Tkinter as tk

class ut_MainMenu():

    def __init__(self, parent):

        menu_frame = tk.Frame(parent)
        options = self.menu_options(menu_frame)
        menu_frame.pack()

    def menu_options(self, parent):

        button_frame = tk.Frame(parent)
        button_1 = tk.Button(button_frame,
                             text="Button 1",
                             command=self.button_1)
        button_1.pack()
        button_2 = tk.Button(button_frame,
                             text="Button 2",
                             command=self.button_2)
        button_2.pack()
        button_frame.pack()

    def button_1(self):
        
        print ("Button 1!")

    def button_2(self):
        
        print ("Button 2!")

if __name__ == "__main__":

    MainWindow = tk.Tk()
    Menu = ut_MainMenu(MainWindow)
    MainWindow.mainloop()
BlackJack

@greinar: Das mit dem ``phyton`` in der ersten Zeile wird wohl nicht klappen. :-)

In dem `Frame` der in `__init__()` erstellt wird, steckst Du nur einen weiteren `Frame`, das scheint mir unnötig.

`options` hat den Wert `None` und wird nirgends verwendet. Weg damit. Wobei ich die `menu_options()`-Methode weg lassen würde und das direkt in die `__init__()` schreiben. Oder zumindest mit einem führenden Unterstrich beim Methodennamen kennzeichnen, dass die nicht von ausserhalb aufgerufen werden soll.

Was soll das `ut_` bei `ut_MainMenu` bedeuten?

Klassen die keine andere Basisklasse haben, sollte man von `object` erben lassen, sonst funktioniert nicht alles so wie erwartet wenn man beispielsweise `property()` verwendet.

Widget-Typen sollten sich nicht selber Layouten, das machen die bereits vorhandenen ja auch nicht. `MainWindow` könnte von `tk.Tk` erben oder man benennt es in `MainFrame` oder `MenuFrame` um und lässt es von `tk.Frame` erben.

`button_1` und `button_2` gehen in einem Beispiel wo sie keine wirkliche Bedeutung haben, in echten Programmen sollte der Name die Bedeutung widergeben.

Bei Python 2 gehören keine Klammern um das ”Argument”. Es ist ja auch gar keines weil ``print`` hier keine Funktion ist. Es sei denn man macht am Anfang vom Modul einen ``from __future__ import print_function``. Dann gehört aber zwischen `print` und der öffnenden Klammer kein Leerzeichen.

`Menu` auf Modulebene wird nicht verwendet. Die drei Zeilen würde ich auch noch in einer Funktion verschwinden lassen.

Zur Namensgebung könntest Du auch mal einen Blick in den Style Guide for Python Code werfen.
greinar
User
Beiträge: 7
Registriert: Dienstag 28. Januar 2014, 15:47

Vielen Dank für deine Hinweise.
BlackJack hat geschrieben:@greinar: Das mit dem ``phyton`` in der ersten Zeile wird wohl nicht klappen. :-)
Autsch. Vor allem wenn man bedenkt, daß sich das dank copy&paste durch einen Großteil meiner Module zieht. :(
BlackJack hat geschrieben:In dem `Frame` der in `__init__()` erstellt wird, steckst Du nur einen weiteren `Frame`, das scheint mir unnötig.
Da ist eigentlich noch ein Label neben den Buttons. Ich habe das für das Beispiel raus genommen, damit es übersichtlicher wird.
BlackJack hat geschrieben: `options` hat den Wert `None` und wird nirgends verwendet. Weg damit.
'options=' habe ich verwendet, weil ich sonst ja keinen Zugriff mehr auf das erstellte Element habe, oder? Ist hier natürlich nicht nötig.
BlackJack hat geschrieben: Wobei ich die `menu_options()`-Methode weg lassen würde und das direkt in die `__init__()` schreiben.
Da das Menü noch weitere Buttons, zumindest noch ein Label und eventuell auch noch weitere Elemente enthalten soll, würde das mMn in '__init__' zu unübersichtlich.
BlackJack hat geschrieben: Was soll das `ut_` bei `ut_MainMenu` bedeuten?
Daran sehe ich, zu welchem "Programm" ein Modul gehört. Schlussendlich verwende ich verschiedene Funktionen aus allen möglichen Modulen 'querbeet'. Alles ziemlich abenteuerlich. Einem Fachmann fangen wahrscheinlich die Augen zu bluten an, wenn er das sieht.
Im konkreten Fall hier weist mich das darauf, das das Modul und die Klasse ein Test sind.
BlackJack hat geschrieben: `button_1` und `button_2` gehen in einem Beispiel wo sie keine wirkliche Bedeutung haben, in echten Programmen sollte der Name die Bedeutung widergeben.

Zur Namensgebung könntest Du auch mal einen Blick in den Style Guide for Python Code werfen.
Werde ich mich bemühen.
BlackJack hat geschrieben: Klassen die keine andere Basisklasse haben, sollte man von `object` erben lassen, sonst funktioniert nicht alles so wie erwartet wenn man beispielsweise `property()` verwendet.

Widget-Typen sollten sich nicht selber Layouten, das machen die bereits vorhandenen ja auch nicht. `MainWindow` könnte von `tk.Tk` erben oder man benennt es in `MainFrame` oder `MenuFrame` um und lässt es von `tk.Frame` erben.
Hier bin ich ganz sicher, daß ich das nicht verstanden habe. :oops:
Wie sollte das konkret aussehen?
greinar
User
Beiträge: 7
Registriert: Dienstag 28. Januar 2014, 15:47

Habe versucht, die Anregungen einzuarbeiten.

Code: Alles auswählen

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import Tkinter as tk

class MainMenuFrame(tk.Frame):

    def __init__(self, master):
        
        tk.Frame.__init__(self)
        self.pack(expand="yes", fill="both", padx=10, pady=10)
        
        self.master.protocol("WM_DELETE_WINDOW", self.quit)
        self.master.title("Main Menu")

        buttons = tk.Frame(self)
        buttons.pack(padx=5, pady=5)
        tk.Button(buttons, text = "Button 1",
                  padx=5, pady=5, bd=3,
                  command = self.button_1).pack(fill="x", pady=2)
        tk.Button(buttons, text = "Button 2",
                  padx=5, pady=5, bd=3,
                  command = self.button_2).pack(fill="x", pady=2)
        tk.Button(buttons, text = "Quit",
                  padx=5, pady=5, bd=3, fg="red",
                  command = self.quit).pack(fill="x", pady=10)
        
    def button_1(self):
        
        print "Button 1!"

    def button_2(self):
        
        print "Button 2!"

def menu_start():
    
    root_window = tk.Tk()
    MainMenuFrame(root_window).mainloop()
    root_window.destroy()

if __name__ == "__main__":

    menu_start()
Antworten