Workshop: Gui Entwicklung in tkinter

Fragen zu Tkinter.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Tkinter bietet nicht so viele Möglichkeiten wie andere professionellere GUIs.
Daher sollte man Tkinter nicht für professionelle Anwendungen mit allen erdenklichen Möglichkeiten nehmen.
Andererseits ist tkinter für den Anfänger gerade wegen seiner Überschaubarkeit schnell beherrschbar, denn er muss sich nicht mit 200 Klassen befassen. Tkinter bietet gerade einmal 18 Widgets.

Und bei ttk sind es 17 Widgets, wobei allerdings nur 6 davon neu hinzukommen. Das macht gerade einmal 24 Widgets.
Uns was den Programmunfang betrifft, also auch sehr komplexe Guis sind in tkinter auch kein Problem.

Ich denke, wir starten einmal zur GUI Erstellung in Tkinter einen Workshop.

Wie soll man beginnen? Da gibt es Top Down oder Bottom Up oder beides gemischt. Was man bereits weiß, kann man implementieren.

Hier beginnen wir einmal mit der Grobstruktur der GUI. Das ist das Programm:

Code: Alles auswählen

# -*- coding: utf-8 -*-

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk


class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.minsize(500, 400)
        # widget definitions ===================================
        self.frame_guinotes = FrameGuinotes(self)
        self.frame_menunotes = FrameMenunotes(self)
        self.frame_toolbarnotes = FrameToolbarnotes(self)
        self.label_PS = tk.Label(self,font='TkFixedFont 10 bold', anchor='w', relief='solid', text='Welches Layout soll man nehmen?\nUnd soll man einen GuiBuilder nehmen?\nWenn ja, welchen?', pady='4', padx='4', fg='#a90000', justify='left', bd='4')
        self.frame_menunotes.pack(fill='x')
        self.frame_toolbarnotes.pack(fill='x')
        self.frame_guinotes.pack(expand=1, fill='both')
        self.label_PS.pack(pady=3, fill='x')

class FrameGuinotes(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.config(highlightthickness=7, highlightcolor='#a90000', highlightbackground='#a90000')
        # widget definitions ===================================
        self.notes_gui = tk.Text(self,font='TkFixedFont 12 bold', width=1, height=1, pady=8, padx=8)
        self.notes_gui.delete(1.0, tk.END)
        self.notes_gui.insert(tk.END,'Und da kommt die eigentliche GUI Anwendung')
        self.notes_gui.pack(expand=1, fill='both')

class FrameMenunotes(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.config(highlightthickness=7, highlightcolor='blue', highlightbackground='blue')
        # widget definitions ===================================
        self.notes_menu = tk.Text(self,font='TkFixedFont 12 bold', height=1, pady=8, padx=8, fg='blue')
        self.notes_menu.delete(1.0, tk.END)
        self.notes_menu.insert(tk.END,'Oben soll ein Menü sein')
        self.notes_menu.pack(expand=1, fill='both')

class FrameToolbarnotes(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.config(relief='sunken', highlightthickness=7, highlightcolor='#008900', highlightbackground='#008900')
        # widget definitions ===================================
        self.notes_toolbar = tk.Text(self,font='TkFixedFont 12 bold', height=1, pady=8, padx=8, fg='#008900')
        self.notes_toolbar.delete(1.0, tk.END)
        self.notes_toolbar.insert(tk.END,'Darunter kommt eine Toolbar mit Photoimages')
        self.notes_toolbar.pack(expand=1, fill='both')

if __name__ == '__main__':
    Application().mainloop()
Das Programm enthält unten noch drei Fragen. Was meint ihr dazu?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Die Resonanz ist nicht gerade gewaltig. OK, dann beantworte ich die Fragen selbst.

Welches Layout man nimmt, hängt ganz davon ab, was man vorhat.

Place Layout

Das Place Layout eignet sich gut als Entwurfslayout, wenn man die genaue Anordnung noch nicht kennt und später dann ein Grid Layout machen möchte.

Außerdem ist es das richtige Layout, wenn man viel Platz hat, und gestalterisch platzieren möchte. Man denke etwa an ein Wohnzimmer. Da hängt ein Bild an der Wand, irgendwo ist ein Wandregal irgendwo ein Schränkchen usw.

Pack Layout

Das Pack Layout Ist ein einfaches Layout für etwas was untereinander oder nebeneinander angeordnet ist oder auch untereinander und dann eine Reihe nebeneinander. Wenn es mehrspaltig oder mehrreihig wird, nimmt man das Grid Layout.

Grid Layout
Das Grid Layout ist das Layout für die Anordnung in Zeilen und Spalten außerdem hat es noch zwei nette Eigenschaften.

Es eignet sich hervorragend, um etwas verschwinden zu lassen, weil man ja eventuell nicht ständig alles von der GUi sehen will.
Bei grid_remove bleiben die grid Optionen erhalten und man kann das Objekt dann einfach durch grid() wieder erscheinen lassen.

Dann ist es hervorragend geeignet, um zwischen zwei oder auch mehr alternativen Fenstern umzuschalten. Da legt man diese Fenster einfach übereinander an und hebt dann mit lift() das gewünschte Fenster hoch.

HIer ein nettes Beispiel dazu:

toggledframe_gui.py

Code: Alles auswählen

# -*- coding: utf-8 -*-

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk
try:
    from tkinter import ttk
except ImportError:
    import ttk

#import DynTkInter as tk # for GuiDesigner
#import DynTtk as ttk    # for GuiDesigner

import toggledframe

# === general grid table definition =================
def grid_general_rows(container,rows,**kwargs):
    for row in range(rows):
        container.rowconfigure(row,**kwargs)

# Application definition ============================

class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.minsize(400, 400)
        # widget definitions ===================================
        self.toggle_frame = ToggledFrame(self,name='#0_toggle_frame')
        self.toggle_frame.pack(fill='both', expand=1)

class ToggledFrame(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.myclass = 'ToggledFrame'
        self.call_code = 'toggledframe.init'
        self.config(bg='#ceff00')
        # general grid definition ==============================
        grid_general_rows(self,2, minsize = 0, pad = 0, weight = 1)
        # individual grid definition ===========================
        self.rowconfigure(0,minsize=0, weight=0, pad=0)
        self.columnconfigure(0,minsize=0, weight=1, pad=0)
        # widget definitions ===================================
        self.ausgabe = tk.Frame(self,name='#1_ausgabe',bg='#ffeb00', relief='solid', bd=4)
        self.ausgabe.grid(row=1, pady=4, sticky='nesw')
        self.eingabe = Eingabe(self,name='#2_eingabe')
        self.eingabe.grid(row=1, pady=4, sticky='nesw')
        self.titleframe = Titleframe(self,name='#3_titleframe')
        self.titleframe.grid(row=0, sticky='ew')
        # call Code ===================================
        toggledframe.init(self)

class Eingabe(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.config(relief='solid', bd=4)
        # widget definitions ===================================
        self.sub_frameA = tk.Frame(self,name='#4_sub_frameA',bg='#ffffd3', height=40)
        self.sub_frameB = tk.Frame(self,name='#5_sub_frameB',bg='#e4f3fc', height=40)
        self.sub_frameC = tk.Frame(self,name='#6_sub_frameC',bg='#cbeed8', width=50, relief='sunken')
        self.sub_frameA.pack(fill='x')
        self.sub_frameB.pack(fill='x')
        self.sub_frameC.pack(fill='both', expand=1, side='left')

class Titleframe(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.config(bg='#ffded8', relief='solid', bd=4)
        # widget definitions ===================================
        self.label = ttk.Label(self,name='#7_label',foreground='blue', text='label')
        self.toggle_button = ttk.Checkbutton(self,name='#8_toggle_button',onvalue=1, offvalue=0, width=2, text='+', style='TButton')
        self.label.pack(fill='y', side='left')
        self.toggle_button.pack(fill='y', side='right')

if __name__ == '__main__':
    #Application().mainloop('guidesigner/Guidesigner.py') # for GuiDesigner
    Application().mainloop()
Und dazu braucht es noch:

toggledframe.py

Code: Alles auswählen

def init(self):

    def toggle(eingabe = self.eingabe, button = self.titleframe.toggle_button):

        if button['text'] == '+':
           button['text'] = '-'
           eingabe.lift()
        else:        
           button['text'] = '+'
           eingabe.lower()

    toggle()
    self.titleframe.toggle_button['command'] = toggle
Das Beispiel ist nicht von mir allein, sondern in Zusammenarbeit mit stefanxfg entstanden.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Jetzt ist die Frage, wie baut man jetzt diesen ToggledFrame in die erste Gui dmit den Notizen ein?

Das ist ganz einfach. In meinem GuiDesigner habe ich zuerst einmal die Defaulteinstellungen für die Breite beim Text Feld für die menu notes und toolbar notes auf 1 gesetzt, weil mir die default 80 nicht gefallen hatten. Aber das ist unwichtig.

Der Rest war ganz einfach. Das Textfeld für die Gui Notes löschen (destroy).
Dann für den Frame myclass setzen etwa auf 'GuiNotes'. Der Name ist egal, nur muss man eine Klasse angeben, weil keine automatisch angelegt wird, wenn keine Widgets enthalten sind.

Und dann habe ich als baseclass angegeben: 'toggledframe_gui.ToggledFrame'

Und schon ist der ToggledFrame eingebaut:

Code: Alles auswählen

# -*- coding: utf-8 -*-

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk

#import DynTkInter as tk # for GuiDesigner

import toggledframe_gui

# Application definition ============================

class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.minsize(500, 400)
        # widget definitions ===================================
        self.frame_guinotes = GuiNotes(self,name='#0_frame_guinotes')
        self.frame_menunotes = FrameMenunotes(self,name='#1_frame_menunotes')
        self.frame_toolbarnotes = FrameToolbarnotes(self,name='#2_frame_toolbarnotes')
        self.label_PS = tk.Label(self,name='#3_label_PS',font='TkFixedFont 10 bold', padx='4', justify='left', text='Welches Layout soll man nehmen?\nUnd soll man einen GuiBuilder nehmen?\nWenn ja, welchen?', bd='4', pady='4', relief='solid', fg='#a90000', anchor='w')
        self.frame_menunotes.pack(fill='x')
        self.frame_toolbarnotes.pack(fill='x')
        self.frame_guinotes.pack(fill='both', expand=1)
        self.label_PS.pack(fill='x', pady=3)

class GuiNotes(toggledframe_gui.ToggledFrame):

    def __init__(self,master,**kwargs):
        toggledframe_gui.ToggledFrame.__init__(self,master,**kwargs)
        self.myclass = 'GuiNotes'
        self.baseclass = 'toggledframe_gui.ToggledFrame'
        self.config(highlightbackground='#a90000', highlightcolor='#a90000', highlightthickness=7)

class FrameMenunotes(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.config(highlightbackground='blue', highlightcolor='blue', highlightthickness=7)
        # widget definitions ===================================
        self.notes_menu = tk.Text(self,name='#4_notes_menu',font='TkFixedFont 12 bold', pady=8, fg='blue', width=1, padx=8, height=1)
        self.notes_menu.delete(1.0, tk.END)
        self.notes_menu.insert(tk.END,'Oben soll ein Menü sein')
        self.notes_menu.pack(fill='both', expand=1)

class FrameToolbarnotes(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.config(relief='sunken', highlightbackground='#008900', highlightcolor='#008900', highlightthickness=7)
        # widget definitions ===================================
        self.notes_toolbar = tk.Text(self,name='#5_notes_toolbar',font='TkFixedFont 12 bold', pady=8, fg='#008900', width=1, padx=8, height=1)
        self.notes_toolbar.delete(1.0, tk.END)
        self.notes_toolbar.insert(tk.END,'Darunter kommt eine Toolbar mit Photoimages')
        self.notes_toolbar.pack(fill='both', expand=1)

if __name__ == '__main__':
    #Application().mainloop('guidesigner/Guidesigner.py') # for GuiDesigner
    Application().mainloop()
Ganz einfach, oder?
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Alfons Mittelmeyer hat geschrieben:Die Resonanz ist nicht gerade gewaltig.
Wollte gestern bereits antworten, hatte mir ja das erste Beispiel kopiert und aufgerufen. Von meiner Seite finde ich so einen Workshop gut und die Resonanz würde ich nicht von einem Tag zum anderen erwarten, eher zeitversetzt über einen etwas längeren Zeitraum. Und dann, allgemein könnten die Zugriffe aufs Forum etwas vom Wetter abhängig sein. Deine andere Frage mit den Checkbuttons hatte ich ebenfalls gelesen, doch da konnte ich ja nun ganz und gar nichts zu schreiben.
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Hallo Alfons. Also baust du das ToggledFrame als eigenständige GUI auf, wobei du die ToggleFrame-klasse zum Einbau in die Haupt-GUI aufrufst. Das ist okay. Somit kann man eigentlich auch diese ToggleFrame mehrmals setzen. Nur wenn man etwaige Labels drinnen hat müsste man wahrscheinlich über eine Benennungsfunktion umbenennen.

Funktionalitäten würdest du über appcode als call_code einfügen. Wie geht das nun über Eventbroker? Vielleicht als Hauptfunktionaliätendatei, wo man dann die eigentlichen Funktionen nur benennt, aber der Code woanders ausgeführt wird?

Achso, kann es sein, das lift und lower nur funktionieren bei leeren Frames. Widgets können nicht verdeckt werden?
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Es wäre schön, dass wenn der GUIDesigner weiß das Code importiert wird, dass er die import-Zeilen setzt. Genauso bitte auch die Acsi-Code bzgl. Python2 mit implementieren.

Code: Alles auswählen

# -*- coding: iso-8859-15 -*-
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

stefanxfg hat geschrieben:Hallo Alfons. Also baust du das ToggledFrame als eigenständige GUI auf, wobei du die ToggleFrame-klasse zum Einbau in die Haupt-GUI aufrufst. Das ist okay. Somit kann man eigentlich auch diese ToggleFrame mehrmals setzen. Nur wenn man etwaige Labels drinnen hat müsste man wahrscheinlich über eine Benennungsfunktion umbenennen.
Das war jetzt eigentlich keine ToggleFrame-klasse, wie es etwa das PanedWindow ist, aber man könnte so eine allgemeine Klasse leicht machen, nämlich ein LiftWindow
stefanxfg hat geschrieben:Funktionalitäten würdest du über appcode als call_code einfügen. Wie geht das nun über Eventbroker? Vielleicht als Hauptfunktionaliätendatei, wo man dann die eigentlichen Funktionen nur benennt, aber der Code woanders ausgeführt wird?
Das mit dem eventbroker ist eine hervorragende Idee. Wenn man den gleich als GUI Bestandteil einbauen würde, könnte man sich die imports sparen, denn wenn dann etwas nicht da ist, so führt dann das nicht zum Absturz. Da denke ich mal darüber nach. Natürlich muß man dann aber doch importieren, wenn man die Funktionalität haben will. Nur wenn man nicht importiert, würde die GUI auch aufgebaut, wenn auch nicht bis in das Detail. wenn die Basisklassen nicht da wären.
stefanxfg hat geschrieben:Achso, kann es sein, das lift und lower nur funktionieren bei leeren Frames. Widgets können nicht verdeckt werden?
Natürlich können Widgets verdeckt werden. Bei pack werden sie nicht verdeckend angeordnet. Aber bei grid und place geht das jederzeit. Und bei Kombination von pack und place oder grid und place ebenso.

Da wollte ich sowieso einen lift und einen lower Button mit reinmachen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

stefanxfg hat geschrieben:Es wäre schön, dass wenn der GUIDesigner weiß das Code importiert wird, dass er die import-Zeilen setzt.
Da hatte ich schon darüber nachgedacht, dass ich das für Main Windows und Toplevel mache. Muss ich aber noch nachdenken, ob bereits ein einziger Import recht, wenn man dazu noch den eventbroker einsetzt. Aber wie auch immer, warum soll man man nicht mehrere Imports machen?
stefanxfg hat geschrieben:Genauso bitte auch die Acsi-Code bzgl. Python2 mit implementieren.

Code: Alles auswählen

# -*- coding: iso-8859-15 -*-
Da hatte ich bereits implementiert:
# -*- coding: utf-8 -*-

Braucht python2 statt utf-8 iso-8859-15?
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Also ich kenne mich damit nicht aus. Allerdings werden bei mir bei UTF8 die Sonderzeichen angemeckert. Mit dem ISO hat es dann funktioniert.

Bei mir hat es mit lift und lower nicht funktionier, aber grid_remove() und grid() haben dasselbe Funktionalität.
BlackJack

@stefanxfg: Der Kodierungskommentar und die tatsächliche Kodierung der Quelltextdatei müssen zusammen passen. Wenn Du Deine Quelltexte als ISO-8859-15 kodiert speicherst, dann muss der Kommentar auch diese Kodierung angeben. Python 2 geht ohne Angabe von ASCII aus, und Python 3 von UTF-8.
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Ich weiß nicht wo ich die Kodierung einstelle. Das müsste ja am Rechner selbst geschehen oder über den GUI-Designer erfolgen, wenn man die Dateien exportiert.
Ansonsten habe ich mir die entsprechenden Dateien im Notepad++ geöffnet und die Kodierung auf UTF-8 umgestellt. Dann wurden einige "ä" umgewandelt. Diese habe ich dann wieder zu "a" per Hand geschrieben und es funktionert.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

stefanxfg hat geschrieben:Also ich kenne mich damit nicht aus. Allerdings werden bei mir bei UTF8 die Sonderzeichen angemeckert. Mit dem ISO hat es dann funktioniert.
Kand sein, utf-8 muss man wahrscheinlich erst entsprechend decodieren. Dann ändere ich das mal für python2 auf ISO. Bald vorgesehen sind dann auch Exportiereinstellungen.
stefanxfg hat geschrieben:Bei mir hat es mit lift und lower nicht funktionier, aber grid_remove() und grid() haben dasselbe Funktionalität.
Hat mein Beispiel bei Dir nicht funktioniert? toggledframe_gui.py geht bei mir sowohl in python3 wie auch in python2.
Vielleicht meinst Du, was Du eventuell noch selber ausprobiert hast, das könnte natürlich sein.

grid_remove() und grid() funktionieren natürlich auch. Lift und lower sind Widget Funktionen und damit layout unabhängig. Damit kann man sogar ein Toplevel hinter das Anwendungsfenstzer setzen, oder ein Toplevel über ein Menü. Das LiftWindow mache ich zu einem StackedWindow und werde darin zwei Layouts anbieten. Ein stack layout, in der ersten Version wahrscheinlich noch parameterlos. In der zweiten Version mit Parametern und in der dritten Version noch dazu ein relatives place layout, wobei man aber auch absolute Angaben setzen kann. So macht man etwa padding bei einem relativen place Layout über absolutes x und y.

Der Clou dabei wird sein, dass man übereinander stapeln kann. So könnte man etwa Karten für ein Kartenspiel übereinander halbverdeckend legen und dann davon abheben.
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Kand sein, utf-8 muss man wahrscheinlich erst entsprechend decodieren. Dann ändere ich das mal für python2 auf ISO. Bald vorgesehen sind dann auch Exportiereinstellungen.
ich denke, dass bei mir der ISO irgendwo eingestellt ist. Ich weiß nicht wo ich ITF-8 als Standard einstellen muss.
BlackJack

@stefanxfg: Welchen Editor verwendest Du denn? Oder ist das Problem bei Dateien die der GUI-Designer erstellt? Dann muss der dafür sorgen, dass die Kodierung und der Kodierungskommentar sich nicht widersprechen.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

stefanxfg hat geschrieben:ich denke, dass bei mir der ISO irgendwo eingestellt ist. Ich weiß nicht wo ich ITF-8 als Standard einstellen muss.
Das musst Du im Editor einstellen. Ich kenne jetzt nur den, mit dem ich arbeite und das ist halt der Notepad++ und da hast Du im Menü als Auswahl "Kodierung" -> "Konvertiere zu UTF-8 ohne BOM". Danach erst speichern. In anderen geeigneten Editoren oder Entwicklungsumgebungen müsste es sich aber ähnlich einstellen lassen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

stefanxfg hat geschrieben:Ich weiß nicht wo ich die Kodierung einstelle. Das müsste ja am Rechner selbst geschehen oder über den GUI-Designer erfolgen, wenn man die Dateien exportiert.
Ansonsten habe ich mir die entsprechenden Dateien im Notepad++ geöffnet und die Kodierung auf UTF-8 umgestellt. Dann wurden einige "ä" umgewandelt. Diese habe ich dann wieder zu "a" per Hand geschrieben und es funktionert.
Also, wenn man unter Python3 speichert, dann wird das automatisch als utf-8 gespeichert.

Wichtig ist, dass man bei seinem Editor auch die Codierung entsprechend setzt. Ich benutze IDLE und habe keine Kodierung eingestellt. Man kann außer 'None' aber auch utf-8 oder local-defines einstellen. Wenn ich eine Quelldatei neu beginne ohne Generierung und habe Umlaute drin, fragt IDLE beim Abspeichern, ob ich das so lassen will, oder IDLE editieren soll. Gebe ich editieren an, scheibt IDLE automatisch den UTF-8 Kommentar hinein.

Also mit IDLE sollte es eigentlich prima funktionieren, zudem weil ich jetzt auch den UTF-8 Kommentar mit generiere.
Auißerdem ist IDLE bestens auf python Source Code abgestimmt.

Noch besser geeignet ist Geany. Das zeigt Dir sogar Variablen, Klassen, importe usw. in einer Treeview an.

Da wäre Geany: https://www.geany.org/Main/HomePage

Ich glaube, ich steige um auf Geany. Da brauche ich nicht lange im Source Code nach meinen Kassen zu suchen, sondern klicke einfach darauf in der Treeview.
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

"UTF-8 ohne BOM" ist bei mir als Standard eingestellt. Die Konvertierung dazu ist ein Befehl und keine Einstellung. Das würde nur Dateien betreffen, welche ich selbst mit Notepad++ erzeugt habe. Aber ich erzeuge sie mit dem GUIDesigner.

Ich habe nochmal etwas exportiert. Nun zeigt mir Notepad++ an, dass als Kodierung "ANSI" eingestellt ist.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

stefanxfg hat geschrieben:Die Konvertierung dazu ist ein Befehl und keine Einstellung.
Ja, ist ein Befehl, hatte mich unkorrekt ausgedrückt. Bei mir ist die Grundeinstellung noch bei ISO, weil der sonst meine älteren Webseiten nicht richtig öffnen würde und ich die immer erst bei einer geplanten Überarbeitung ändere.
ANSI ist eigentlich auch nicht verkehrt, wenn Du aber unbedingt UTF-8 möchtest, dann schreib in einem Kommentar etwas mit einem Umlaut, speichere mit UTF-8 und der wird dann auch bei UTF-8 bleiben.
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Das mag ja sein. Aber ich benötige die Lösung auch für den GUIDesigner, da ich ihn durchaus benutzen möchte und aber bisher die Dateien auf ANSI-Format exportiert werden. Das liegt nicht an Notepad++. Das Format muss irgendwo anders enzustellen gehen.

@Alfons
Nach deinen Worten ist dir bisher die KOdierung im IDLE nicht so wichtig. Möglicherweise wird deswegen ein anderes Format bei mir erzeugt. Vielleicht musst du das bei dir explizit setzen, so dass dann auch eine Datei im UTF-8 Format rausgeschrieben wird, und zwar unabhängig vom System den der USer benutzt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

stefanxfg hat geschrieben:"UTF-8 ohne BOM" ist bei mir als Standard eingestellt. Die Konvertierung dazu ist ein Befehl und keine Einstellung. Das würde nur Dateien betreffen, welche ich selbst mit Notepad++ erzeugt habe. Aber ich erzeuge sie mit dem GUIDesigner.

Ich habe nochmal etwas exportiert. Nun zeigt mir Notepad++ an, dass als Kodierung "ANSI" eingestellt ist.
Solange keine deutschen Umlaute enthalten sind, vieleicht ist es dann so bei Notepad++.

Aber Geany erkennt, was es ist und zeigt bei einer von mir generierten Datei UTF-8 ohne BOM an und speichert sie dann auch wieder in diesem Format. Da braucht man also nichts einstellen.

Bei IDLE habe ich keinen Menüpunkt Dateieigenschaften gefunden aber speichert auch richtig ab und encodiert richtig, weil es die Kommentarzeile interpretiert.

Wenn deutsche Umlaute vorkommen und keine solche Kommentarzeile, macht IDLE das:

Bild

Macht darauf aufmerksam, dass diese Kommentarzeile fehlt, bietet an, selber UTF-8 einzufügen oder nichts dergleichen, dann speichert es UTF-8 ohne solche Kommentarzeile ab. Für python3 braucht man sie auch nicht.

Übrigens, IDLE ist doch gut, da gibt es im Menü auch einen Klassenbrowser. Arbeite schon lange damit. Habe mir aber das Menü noch gar nicht so angeschaut, sondern nur File speichern und Bearbeiten, wie suchen, suchen ersetzen, alles markieren.

Ich würde IDLE nehmen, das ist gut überschaubar und ist der Standard Editor für Python. Normalerweise ist er auch bei python binary packages mit dabei.
Antworten