Ich brauche Hilfe, beim Tkinter Vollbilmodus!!!

Fragen zu Tkinter.
Antworten
koenigssphinx
User
Beiträge: 14
Registriert: Samstag 11. Mai 2013, 10:51
Kontaktdaten:

Hallo,
als ich neulich an einem Programm gearbeitet habe, stellte sich mir die Frage, wie ich den Wechsel in den Vollbildmodus vollziehe.
Der Code in __init__():

Code: Alles auswählen

self.fullscreen = False
self.main.bind("<KeyPress-F11>", self.chf)
Der Code in chf():

Code: Alles auswählen

self.fullscreen = not self.fullscreen
self.main.wm_attributes("-fullscreen", self.fullscreen)
Könnt ihr mir sagen, was für einen Fehler ich gemacht habe? :K

Code: Alles auswählen

Königssphinx die 1. die Python kann
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi koenigssphinx

Kannst du das folgende Skript einmal ausprobieren?:

Code: Alles auswählen

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

try:
    #~~ For Python 2.x
    import Tkinter as tk
except ImportError:
    #~~ For Python 3.x
    import tkinter as tk

APP_WIN_XPOS = 50
APP_WIN_YPOS = 300
APP_WIN_WIDTH = 400
APP_WIN_HEIGHT = 400

class App(object):
    
    def __init__(self):
        self.win = tk.Tk()
        self.win.protocol("WM_DELETE_WINDOW", self.close)

        self.win.title("Application size")
        self.win.geometry('{0}x{1}+{2}+{3}'.format(
            APP_WIN_WIDTH, APP_WIN_HEIGHT, APP_WIN_XPOS, APP_WIN_YPOS))

        self.win.bind('<F11>', self.fullscreen)
        self.win.bind('<KeyPress-Escape>', self.app_size)
        
        self.label_text = tk.StringVar()
        self.label = tk.Label(self.win, textvariable=self.label_text)
        self.label.pack(expand=True)
        self.label_text.set("Press key F11 for fullscreen")
        
        self.win.focus_set()

    def fullscreen(self, event):
        self.win.title("Fullscreen")
        self.label_text.set("Press key Esc for application screensize")
        self.win.wm_attributes("-fullscreen", True)

    def app_size(self, event):
        self.win.title("Application size")
        self.label_text.set("Press key F11 for fullscreen")
        self.win.wm_attributes("-fullscreen", False)
        
    def run(self):
        self.win.mainloop()
    
    def close(self):
        # Do things before closing application
        self.win.destroy()
            
app = App().run()
Gruss wuf :wink:
Take it easy Mates!
koenigssphinx
User
Beiträge: 14
Registriert: Samstag 11. Mai 2013, 10:51
Kontaktdaten:

Danke!
Das Skript funktioniert, aber ich brauche es eigentlich so, dass <F11> beides übernimmt.
Ich versuche es erstmal mit diesem Ansatz.

Danke

Code: Alles auswählen

Königssphinx die 1. die Python kann
koenigssphinx
User
Beiträge: 14
Registriert: Samstag 11. Mai 2013, 10:51
Kontaktdaten:

Dankeschön!! Ich habe das Problem gelöst!
Der Code:

Code: Alles auswählen

try:
    #~~ For Python 2.x
    import Tkinter as tk
except ImportError:
    #~~ For Python 3.x
    import tkinter as tk

APP_WIN_XPOS = 50
APP_WIN_YPOS = 300
APP_WIN_WIDTH = 400
APP_WIN_HEIGHT = 400

class App(object):
   
    def __init__(self):
        self.fullscreen = False
        self.win = tk.Tk()
        self.win.protocol("WM_DELETE_WINDOW", self.close)

        self.win.title("Application size")
        self.win.geometry('{0}x{1}+{2}+{3}'.format(
            APP_WIN_WIDTH, APP_WIN_HEIGHT, APP_WIN_XPOS, APP_WIN_YPOS))

        self.win.bind('<F11>', self.cf)
       
        self.label_text = tk.StringVar()
        self.label = tk.Label(self.win, textvariable=self.label_text)
        self.label.pack(expand=True)
        self.label_text.set("Press key F11 for fullscreen")
       
        self.win.focus_set()
    def cf(self, event):
        self.fullscreen = not self.fullscreen
        if self.fullscreen:
            self.app_size()
        else:
            self.cfullscreen()
    def cfullscreen(self):
        self.win.title("Fullscreen")
        self.label_text.set("Press key Esc for application screensize")
        self.win.wm_attributes("-fullscreen", True)

    def app_size(self):
        self.win.title("Application size")
        self.label_text.set("Press key F11 for fullscreen")
        self.win.wm_attributes("-fullscreen", False)
       
    def run(self):
        self.win.mainloop()
   
    def close(self):
        # Do things before closing application
        self.win.destroy()
           
app = App()
app.run()

Code: Alles auswählen

Königssphinx die 1. die Python kann
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

cfullscreen und app_size sind im Prinzip identisch, das solltest du noch zu einer Methode zusammenfassen.
Das Leben ist wie ein Tennisball.
koenigssphinx
User
Beiträge: 14
Registriert: Samstag 11. Mai 2013, 10:51
Kontaktdaten:

Nein kann ich nicht, weil ich es früher ja so gemacht habe, aber das hat auch nicht funktioniert.
Schade,
in deinem Skript funktioniert es zwar, aber im Programm nicht.
Könnte mir vielleicht doch noch jemand helfen?

Grüße Königsphinx

Code: Alles auswählen

Königssphinx die 1. die Python kann
BlackJack

@koenigssphinx: Doch die kannst Du zusammenfassen. Warum sollte das nicht funktionieren? Und wenn das in Deinem Programm nicht funktioniert, dann musst Du *dort* irgend etwas anders machen als in dem Beispielprogramm.
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Mit ner "if"-Schleife kannst du es zusammenfassen.
BlackJack

@Dami123: http://if-schleife.de/

Und da braucht man kein ``if`` das geht einfacher mit dem ``not`` wie koenigssphinx das ja auch schon selbst gezeigt hat.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi koenigssphinx

Hier eine mögliche Lösung:

Code: Alles auswählen

try:
    #~~ For Python 2.x
    import Tkinter as tk
except ImportError:
    #~~ For Python 3.x
    import tkinter as tk

APP_WIN_XPOS = 50
APP_WIN_YPOS = 300
APP_WIN_WIDTH = 400
APP_WIN_HEIGHT = 400

class App(object):
   
    def __init__(self):
        self.fullscreen = False
        self.win = tk.Tk()
        self.win.protocol("WM_DELETE_WINDOW", self.close)

        self.win.title("Application size")
        self.win.geometry('{0}x{1}+{2}+{3}'.format(
            APP_WIN_WIDTH, APP_WIN_HEIGHT, APP_WIN_XPOS, APP_WIN_YPOS))

        self.win.bind('<F11>', self.toggle_screen_size)
       
        self.label_text = tk.StringVar()
        self.label = tk.Label(self.win, textvariable=self.label_text)
        self.label.pack(expand=True)
        self.label_text.set("Press key F11 for fullscreen")
        self.fullscreen  = False
        
        self.win.focus_set()
 
    def toggle_screen_size(self, event):
        if self.fullscreen:
            self.win.title("Application size")
            self.label_text.set("Press key F11 for fullscreen")
            self.win.wm_attributes("-fullscreen", False)
        else:
            self.win.title("Fullscreen")
            self.label_text.set("Press key F11 for application screensize")
            self.win.wm_attributes("-fullscreen", True)

        self.fullscreen = not self.fullscreen
        
    def run(self):
        self.win.mainloop()
   
    def close(self):
        # Do things before closing application
        self.win.destroy()
           
app = App()
app.run()
Gruß wuf :wink:
Take it easy Mates!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

def toggle_screen_size(self, event):
    if self.fullscreen:
        title, text = "Application size", "Press key F11 for fullscreen"
    else:
        title, text = "Fullscreen", "Press key F11 for application screensize"

    self.win.title(title)
    self.label_text.set(text)
    self.win.wm_attributes("-fullscreen", not self.fullscreen)

    self.fullscreen = not self.fullscreen
oder

Code: Alles auswählen

title, text = (
    ("Fullscreen", "Press key F11 for application screensize"),
    ("Application size", "Press key F11 for fullscreen"))[self.fullscreen]
Das Leben ist wie ein Tennisball.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

oder:

Code: Alles auswählen

    def toggle_screen_size(self, event):
        self.fullscreen = not self.fullscreen
        title, text = (
            ("Application size", "Press key F11 for fullscreen"),
            ("Fullscreen", "Press key F11 for application screensize")
            )[self.fullscreen]
        self.win.title(title)
        self.label_text.set(text)
        self.win.wm_attributes("-fullscreen", self.fullscreen)
Gruß wuf :wink:
Take it easy Mates!
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

oder:

Code: Alles auswählen

    def toggle_screen_size(self, event):
        TITLES = ("Application size", "Fullscreen")
        self.fullscreen = not self.fullscreen
        self.win.title(TITLES[self.fullscreen])
        self.label_text.set("Press key F11 for %s"%TITLES[not self.fullscreen].lower())
        self.win.wm_attributes("-fullscreen", self.fullscreen)
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

BlackJack hat geschrieben:@Dami123: http://if-schleife.de/

Und da braucht man kein ``if`` das geht einfacher mit dem ``not`` wie koenigssphinx das ja auch schon selbst gezeigt hat.
Stimmt, "not" ist da die bessere Wahl!
Wird mir wohl nie wieder vorkommen, dass ich eine "if"-Abfrage als Schleife bezeichne :D *add site to bookmarks*
koenigssphinx
User
Beiträge: 14
Registriert: Samstag 11. Mai 2013, 10:51
Kontaktdaten:

Zwei Sachen:
1. Ich benutze Python 2.7(ja es gibt schon 3.3 ich weiß)
2. Tut mir leid, aber dies Hilft auch nicht weiter.
Schade, aber ich hoffe auf weiter Vorschläge, und probiere weiter aus

Code: Alles auswählen

Königssphinx die 1. die Python kann
BlackJack

@koenigssphinx: Da kannst Du wahrscheinlich lange warten, denn die Lösung(en) stehen hier ja. Warum das bei *Dir* nicht funktioniert, kann man nicht sagen solange Du nicht verrätst was Du denn jetzt konkret anders machst als die Beispielprogramme.
koenigssphinx
User
Beiträge: 14
Registriert: Samstag 11. Mai 2013, 10:51
Kontaktdaten:

Na Schön. Eigentlich sollte der Code ja bis zum Ende mein Geheimnis bleiben, aber jetzt bleibt mir wohl nicht mehr viel übrig.

Code: Alles auswählen

class Editor:
    def __init__(self):
        self.fs = False
        self.fil = "Untitled Document"
        self.save = True
        self.main = Tk(className="")
        self.main.title("pyIDE [Untitled Document] 1.0")
        scroll = Scrollbar(self.main)
        scroll.pack(side=RIGHT, fill=Y)
        self.content = Text(self.main, yscrollcommand=scroll.set, wrap=WORD, tabs=("1c"))
        scroll.config(command=self.content.yview)
        self.content.bind("<Any-KeyPress>", self.unsave)
        self.main.bind_all("<Control-KeyPress-s>", self.sfe)
        self.main.bind("<Configure>", self.expand)
        self.main.bind_all('<F11>', self.cf)
        self.content.pack()
        self.main.geometry("700x500")
        self.menu = Menu(self.main)
        self.main.config(menu=self.menu)
        filemenu = Menu(self.menu, tearoff=0)
        self.menu.add_cascade(label="File", menu=filemenu)
        nfm = Menu(self.menu, tearoff=0)
        filemenu.add_cascade(label="New", menu=nfm)
        nfm.add_command(label="Empty Project", command=self.nf)
        nfm.add_command(label="OOP Project", command=self.nfo)
        nfm.add_command(label="Form Project", command=self.nff)
        filemenu.add_command(label="Open", command=self.of)
        filemenu.add_command(label="Save", command=self.sf)
        filemenu.add_command(label="Save As", command=self.sfa)
        filemenu.add_separator()
        self.main.after(100, self.iniform)
        self.main.after(0, self.register)
        filemenu.add_command(label="Exit", command=self.main.destroy)
        exemenu = Menu(self.menu, tearoff=0)
        self.menu.add_cascade(label="Execute", menu=exemenu)
        exemenu.add_command(label="Run", command=self.run)
        exemenu.add_command(label="Run Line for Line(Debug)", command=self.runlfl)
        helpmenu = Menu(self.menu, tearoff=0)
        self.menu.add_cascade(label="?", menu=helpmenu)
        helpmenu.add_command(label="Register", command=self.reg)
        self.main.protocol("WM_DELETE_WINDOW", self.close)
    def cf(self, event):
        self.main.wm_attributes("-fullscreen", not self.fs)
        self.fs= not self.fs
    def reg(self):
        s = registerDialog()
    def runlfl(self):
        try:
            self.content.tag_configure("err", background="white")
        except:
            pass
        x = self.content.get('1.0', END)
        y = 0
        x = x.split("#:breakpoint")
        for i in x:
            try:
                y += 1
                exec(i)
                if i != len(x)-1:
                    showwarning("SystemBreak", "Die weitere Ausführung des Programmes wurde durch einen Breakpoint verhindert!")
            except:
                showerror("Fehler!", "Die Ausführung des Programmes wurde unterbrochen in Zeile " + str(y) + "!!!")
                self.content.tag_add("err", str(y) + ".0", str(y) + ".end")
                self.content.tag_configure("err", background="red")
                break
    def run(self):
        try:
            self.content.tag_configure("err", background="white")
        except:
            pass
        try:
            exec(self.content.get('1.0',END))
        except TypeError:
            print e.TYPEError(1, "<pyIDE>", "<content>")
            return
        except ImportError:
            print e.IMPORTError(1, "<pyIDE>", "<content>")
            return
        except NameError:
            print e.NAMEError(1, "<pyIDE>", "<content>")
            return
        except OSError:
            print e.osError(1, "<pyIDE>", "<content>")
            return
        except SystemExit:
            print e.EXITError(1, "<pyIDE>", "<content>")
            return
        except SyntaxError:
            print e.SYNTAXError(1, "<pyIDE>", "<content>")
            return
        except EOFError:
            print e.eofError(1, "<pyIDE>", "<content>")
            return
        except KeyboardInterrupt:
            print e.KEYError(1, "<pyIDE>", "<content>")
            return
        except MemoryError:
            print e.MEMError(1, "<pyIDE>", "<content>")
            return
        except AssertionError:
            print e.ASSERTONError(1, "<pyIDE>", "<content>")
            return
        except:
            print e.Error(1, "<pyIDE>", "<content>")
            return
    def register(self):
        c = registerCheck()
        if not c:
            s = registerDialog()
    def iniform(self):
        self.form = Form()
    def expand(self, event):
        self.content.config(width=event.width)
        self.content.config(height=event.height)
    def sfe(self, event):
        self.sf()
    def unsave(self, event):
        if self.save:
            letter = "abcdefghijklmnopqrstuvwxyz1234567890äÄöÖüÜABCDEFGHIJKLMNOBQRSTUVWXYZ!\"\\<>|-:,^°'#*+§$%&/()= "
            if event.keysym in letter:
                self.save = False
                self.main.title("pyIDE [" + self.fil + "]* 1.0")
    def sf(self):
        if self.fil != "Untitled Document":
            try:
                fli = open(self.fil, "w")
                self.main.title("pyIDE [" + self.fil + "] 1.0")
                fli.write(self.content.get('1.0',END))
                fli.close()
            except:
                showerror("Fehler!", "Das Speichern hat nicht geklappt!")
        else:
            self.sfa()
    def sfa(self):
        try:
            fil = asksaveasfilename(filetypes=(("Python Files", "*.py"), ("Python File(no console)","*.pyw"), ("All Files", "*.*")), defaultextension="*.py")
            if fil != '':
                self.fil = fil
                fli = open(self.fil, "w")
                fli.write(self.content.get('1.0',END))
                fli.close()
                self.save = True
                self.main.title("pyIDE [" + self.fil + "] 1.0")
            else:
                showwarning("Info!", "Eine Datei muss ausgewählt werden!\nWurde nicht gespeichert!")
        except:
            showerror("Fehler!", "Das Speichern hat nicht geklappt!")
    def of(self):
        fil = askopenfilename(filetypes=(("Python Files", "*.py"), ("Python File(no console)","*.pyw"), ("All Files", "*.*")), defaultextension="*.py")
        if fil != '':
            try:
                xname = open(fil, "r")
                con = xname.readlines()
                xname.close()
                self.nf()
                self.fil = fil
                self.main.title("pyIDE [" + self.fil + "] 1.0")
                for i in con:
                    self.content.insert(END, i)
            except:
                showerror("Fehler!", "Die Datei konnte nicht geöffnet werden!")
        else:
            showwarning("Info!", "Eine Datei muss ausgewählt werden\nWurde nicht geöffnet!")
    def nf(self):
        self.fil = "Untitled Document"
        if not self.save:
            if askyesno("ACHTUNG!", "Soll der Text gespeichert werden?"):
                self.sf()
        self.main.title("pyIDE [Untitled Document] 1.0")
        self.content.delete('1.0', END)
    def nfo(self):
        self.nf()
        oopc = """class Main:
    def __init__(self, base):
        self.base=base
        pass
app=Main()
"""
        self.content.insert('1.0', oopc)
    def nff(self):
        self.nf()
        oopc = """from **formfile** import Form
class Main(Form):
    def __init__(self):
        Form.__init__(self)
app=Main()
app.MainLoop()
"""
        self.content.insert('1.0', oopc)
    def initialize(self):
        self.main.mainloop()
    def close(self):
        # Do things before closing application
        self.main.destroy()

Code: Alles auswählen

Königssphinx die 1. die Python kann
BlackJack

@koenigssphinx: Und jetzt könntest Du daraus ein minimales, aber lauffähiges Beispiel basteln, welches das Problem zeigt. Also alles rauswerfen was nicht zum Problem gehört. Dabei wirst Du vielleicht selber schon feststellen wo das Problem liegt.
koenigssphinx
User
Beiträge: 14
Registriert: Samstag 11. Mai 2013, 10:51
Kontaktdaten:

Ok! Getan, jetzt funktioniert alles, aber nur im MiniCode.
Der Code:

Code: Alles auswählen

# -*- coding: cp1252 -*-
from Tkinter import *
class Editor:
    def __init__(self):
        self.fs = False
        self.fil = "Untitled Document"
        self.main = Tk(className="")
        self.main.title("pyIDE [Untitled Document] 1.0")
        scroll = Scrollbar(self.main)
        scroll.pack(side=RIGHT, fill=Y)
        self.content = Text(self.main, yscrollcommand=scroll.set, wrap=WORD, tabs=("1c"))
        scroll.config(command=self.content.yview)
        self.main.bind("<Configure>", self.expand)
        self.main.bind_all('<F11>', self.cf)
        self.content.pack()
        self.main.geometry("700x500")
        self.main.protocol("WM_DELETE_WINDOW", self.close)
    def cf(self, event):
        self.main.wm_attributes("-fullscreen", not self.fs)
        self.fs= not self.fs
    def expand(self, event):
        self.content.config(width=event.width)
        self.content.config(height=event.height)
    def initialize(self):
        self.main.mainloop()
    def close(self):
        # Do things before closing application
        self.main.destroy()

m = Editor()
m.initialize()

Code: Alles auswählen

Königssphinx die 1. die Python kann
BlackJack

@koenigssphinx: Das nützt ja nichts, wir brauchen ein Codebeispiel welches *nicht* funktioniert, aber nicht den ganzen Kram enthält an dem es *nicht* liegt das es nicht funktioniert. Irgendetwas von dem was Du jetzt weg gelassen hast, ist der Grund warum es in Deinem vollständigen Programm nicht funktioniert. Dem kommt man auf die Spur in dem man Stück für Stück entfernt, solange bis das Problem nicht mehr auftritt. Irgend wann kommt man dann zu einem Punkt da funktioniert es und vor dem entfernen eines Codestücks funktionierte es nicht. Dann weiss man an welchem Code es liegt.
Antworten