Nicht-Funktion wenn tkinter.filedialog verwendet wird

Fragen zu Tkinter.
Antworten
Segelbär
User
Beiträge: 9
Registriert: Dienstag 31. Dezember 2019, 09:21

Hallo Zusammen,

Habe aus einem Lehrbuch folgendes Script genommen und um einen Aufruf von filedialog.askdirectory erweitert.
Wenn der filedialog.askdirectory aaskommentiert ist kann man mit dem Button "w öffnen" ein Fenster öffnen und mit "w beenden" wieder schließen. Wenn filedialog.askdirectory mit eingebunden ist, öffnet kein Fenster. "Beenden" geht normal.

Folgende Fehlermeldung kommt immer:
objc[83946]: Class FIFinderSyncExtensionHost is implemented in both /System/Library/PrivateFrameworks/FinderKit.framework/Versions/A/FinderK
it (0x7fff86ac1cd0) and /System/Library/PrivateFrameworks/FileProvider.framework/OverrideBundles/FinderSyncCollaborationFileProviderOverride
.bundle/Contents/MacOS/FinderSyncCollaborationFileProviderOverride (0x110e0ecd8). One of the two will be used. Which one is undefined.


Habe probiert filedialog.askdirectory in der Class zu packen, in eine eigene Funktion zu legen und direkt vor Mainloop zu legen. Kein Unterschied.
Woran liegt das?

Code: (OSX 13)

Code: Alles auswählen

#!/usr/bin/python3
import tkinter as tk
#import tkinter as *
#import os
from tkinter import filedialog

def ask_directory():
    try:
        fdname = filedialog.askdirectory()
        print(fdname)
    except:
        pass
#        with os.scandir(self.fdname) as it:
#            for entry in it:
#                if not entry.name.startswith('.') and entry.is_file():
#                    print(entry.name)

class Mainwindow(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('root Fenster')
        self.window = None
        tk.Label(self, text="--> root <--").pack()
        tk.Button(self, text='Beenden', command=self.destroy).pack()
        tk.Button(self, text='w öffnen', command=self.open_window).pack()
        tk.Button(self, text='w beenden', command=self.close_window).pack()
        #print(os.fspath(os.getcwd()))
        #print(os.getcwd())
        #fdname = tk.StringVar()


    def close_window(self):
        self.window.destroy()

    def open_window(self):
        self.window = tk.Toplevel(self)
        tk.Label(self.window, text="--> w <--").pack()

def open_root():
    root = Mainwindow()
#    ask_directory()
    fdname = filedialog.askdirectory()
#    print(fdname)
    root.mainloop()

if __name__ == '__main__':
    open_root()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das hat nichts mit deinem Code zu tun, sondern mit einem Laufzeitproblem in objective C. Zwei Frameworks definieren das gleich Symbol. Das sieht seltsam aus. Woher kommt das Python?
tom.somebody
User
Beiträge: 12
Registriert: Montag 15. Juli 2019, 20:39

Ich glaube so, wie du es gemacht hast funktioniert das nicht.
So wie ich den Code verstehe, blockierst du mit dem Befehl: fdname = filedialog.askdirectory() dein Hauptfenster. Erst wenn du den Dialog schließt, sollten alle Buttons und das Hauptfenster wieder funktionieren.
Ich hätte in der Klasse: Mainwindow einen weiteren Button erstellt, welcher beim Klick eine Methode ausführt, in der du die Zeile fdname = filedialog.askdirectory() stehen hast. Ich lerne leider auch erst seit paar Wochen Python, also kann das auch Blödsinn sein. Aber so hätte ich das wohl gemacht.

Grad getestet...läuft:

Code: Alles auswählen

#!/usr/bin/python3
import tkinter as tk
#import tkinter as *
#import os
from tkinter import filedialog

class Mainwindow(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('root Fenster')
        self.window = None
        tk.Label(self, text="--> root <--").pack()
        tk.Button(self, text='Beenden', command=self.destroy).pack()
        tk.Button(self, text='w öffnen', command=self.open_window).pack()
        tk.Button(self, text='w beenden', command=self.close_window).pack()
        tk.Button(self, text='dialog öffnen', command=self.open_dialog).pack()
        #print(os.fspath(os.getcwd()))
        #print(os.getcwd())
        #fdname = tk.StringVar()

    def open_dialog(self):
        self.fdname = filedialog.askdirectory()
        print(self.fdname)

    def close_window(self):
        self.window.destroy()

    def open_window(self):
        self.window = tk.Toplevel(self)
        tk.Label(self.window, text="--> w <--").pack()

def open_root():
    root = Mainwindow()
    root.mainloop()

if __name__ == '__main__':
    open_root()
Ich weiß, dass ich nichts weiß und jetzt wisst ihr es auch. Also Vorsicht bei meinen Beiträgen.
Segelbär
User
Beiträge: 9
Registriert: Dienstag 31. Dezember 2019, 09:21

Hallo __deets__,

ja ist Python. Wie kann ich das abstellen?

Hallo tom.somebody,

ich hatte verschiedenen Varianten probiert, die Button funktionieren nur nachdem das askfilename Fenster zu ist. Danach öffnen sich aber die Fenster durch den Button nicht. Wenn askfilename nicht vorkommt, geht das.

Gruß
Sven
Segelbär
User
Beiträge: 9
Registriert: Dienstag 31. Dezember 2019, 09:21

Danke tom.somebody,,

auch getestet, Läuft.

Leider gibt es noch immer die Fehlermeldung. Jemand eine Idee wie mann das abstellen kann?

Gruß
Sven
tom.somebody
User
Beiträge: 12
Registriert: Montag 15. Juli 2019, 20:39

Leider gibt es noch immer die Fehlermeldung. Jemand eine Idee wie mann das abstellen kann?
Nimm ein Windows! :)

Wenn ich mir deine Fehlermeldung durchlese, würde ich sagen, dass ist ein Mac-Problem. Eine Klasse ist in deinem Mac in zwei Modulen enthalten...und die Fehlermeldung wird eher eine Warning-Meldung sein, die mMn ignoriert werden kann.
Ich weiß, dass ich nichts weiß und jetzt wisst ihr es auch. Also Vorsicht bei meinen Beiträgen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe nicht gefragt, *ob* du Python benutzt. Sondern woher das kommt. Und hast du dein System mit dem OS so bekommen, oder hast du das aktualisiert?
Segelbär
User
Beiträge: 9
Registriert: Dienstag 31. Dezember 2019, 09:21

Hallo __deets__,

habe OSX 10.13.6 MacOsX ist aktuell. Python 3.8.1 Habe das Python von Python.org im Dezember runter geladen ohne OS oder tkinter zu aktualisieren.

Gruß
Sven
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Scheint ja ein allgemeines Problem zu sein: https://stackoverflow.com/questions/469 ... n-xcode-si
Segelbär
User
Beiträge: 9
Registriert: Dienstag 31. Dezember 2019, 09:21

Den Code habe ich aus Python -the Bible (von einem Link zu seinem Beispiel Code) und dann verändert um damit zu experimentieren.

Gruß
Sven
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn man danach sucht, findet man https://stackoverflow.com/questions/469 ... n-xcode-si - wie Sirius3 das auch gerade gefunden hat. Und daran kannst du nichts machen, es ist auch nicht die Schuld von Python selbst. Sondern eine Inkonsistenz in Apples Bibliotheken. Musst du leider mit leben.
Segelbär
User
Beiträge: 9
Registriert: Dienstag 31. Dezember 2019, 09:21

OK, danke dir __deets__, dann wird es hoffentlich ein Update fixen.

Gruß
Sven
Antworten