icon

Das Wissen aller Anwender nutzen

Im Allplan Connect Forum tauschen sich Anwender aus, geben wertvolle Tipps oder beraten sich bei ganz konkreten Aufgabenstellungen − auch international.
Und damit wirklich keine Frage unbeantwortet bleibt, unterstützen die Mitarbeiter des Technischen Supports ebenfalls aktiv das Forum.

Es erwarten Sie:

  • Foren-Vielfalt aus CAD Architektur, CAD Ingenieurbau uvm.
  • Tipps von User für User
  • international: Deutsch, Englisch, Italienisch, Französisch und Tschechisch

Melden Sie sich jetzt an und diskutieren Sie mit!

Zur Registrierung

[Frage] OpenFolderDialog statt OpenFileDialog [Gelöst]

Schlagworte:
  • PythonParts
  • FileDialog
  • DirectoryPicker
  • OpenFolder
  • Palette

Hallo,

ich suche nach einer Lösung um einen Pfad in der .pyp von User hinterlegen zu lassen.
Ich habe gesehen, es gibt den Befehl OpenFileDialog, dieser verlangt aber speziell nach einer Datei. Ich würde aber nur den Order auswählen statt einer Datei. Also eine Art DirectoryPicker oder eben OpenFolderDialog

Momentan muss der User den Pfad per Copy Paste in ein String Feld kopieren, ich habe bis jetzt keine andere Lösung gefunden.

Falls es eine gibt, wäre ich sehr froh drum

Gruss Sebastian

Lösung anzeigen Lösung verbergen

Zitiert von: thesocialpotwal
Hallo,
ich suche nach einer Lösung um einen Pfad in der .pyp von User hinterlegen zu lassen. ... ich habe bis jetzt keine andere Lösung gefunden. Falls es eine gibt, wäre ich sehr froh drum
Gruss Sebastian

Hi,
Die Lösung ist tkinter in verbindung mit einem Ganz normalen Button. Definiere ein Button in deinem Pyp:
        
<Parameter>
    <Name>RowDirectory</Name>
    <Text>Beschreibung</Text>
    <ValueType>Row</ValueType>
    <Parameter>
        <Name>DirectoryButton</Name>
        <TextDyn>Directory or "Browse..."</TextDyn>
        <EventId>1001</EventId>
        <ValueType>Button</ValueType>
    </Parameter>
</Parameter>

Und einen unsichtbaren Parameter, wo der Pfad gespepichert wird:

<Page>
  <Name>__HiddenPage__</Name>
  <Text/>
  <Parameters>
    <Parameter>
      <Name>Directory</Name>
      <Text/>
      <Value/>
      <ValueType>String</ValueType>
    </Parameter>
</Page>

Im Skript, öffne den Dialog unter "on_control_event":

import tkinter as tk
from tkinter import filedialog
...
def on_control_event(... event_id: int) -> bool:
    if event_id == 1001:
        root = tk.Tk()
        root.withdraw()
        new_directory = filedialog.askdirectory(initialdir=build_ele.Directory.value)
        root.destroy()

        if not new_directory:   # wenn der User auf "Abbrechen" klickt, leeres String wird zurückgegeben; in dem Fall soll es nicht übernommen werden
            return False        # palette refresh nicht notwendig, also False

        build_ele.Directory.value = new_directory

        return True             # palette refresh notwendig, um auf dem Button den neuen Ordnernamen anzuzeigen

Grüße,
Bart

Zitiert von: thesocialpotwal
Hallo,
ich suche nach einer Lösung um einen Pfad in der .pyp von User hinterlegen zu lassen. ... ich habe bis jetzt keine andere Lösung gefunden. Falls es eine gibt, wäre ich sehr froh drum
Gruss Sebastian

Hi,
Die Lösung ist tkinter in verbindung mit einem Ganz normalen Button. Definiere ein Button in deinem Pyp:
        
<Parameter>
    <Name>RowDirectory</Name>
    <Text>Beschreibung</Text>
    <ValueType>Row</ValueType>
    <Parameter>
        <Name>DirectoryButton</Name>
        <TextDyn>Directory or "Browse..."</TextDyn>
        <EventId>1001</EventId>
        <ValueType>Button</ValueType>
    </Parameter>
</Parameter>

Und einen unsichtbaren Parameter, wo der Pfad gespepichert wird:

<Page>
  <Name>__HiddenPage__</Name>
  <Text/>
  <Parameters>
    <Parameter>
      <Name>Directory</Name>
      <Text/>
      <Value/>
      <ValueType>String</ValueType>
    </Parameter>
</Page>

Im Skript, öffne den Dialog unter "on_control_event":

import tkinter as tk
from tkinter import filedialog
...
def on_control_event(... event_id: int) -> bool:
    if event_id == 1001:
        root = tk.Tk()
        root.withdraw()
        new_directory = filedialog.askdirectory(initialdir=build_ele.Directory.value)
        root.destroy()

        if not new_directory:   # wenn der User auf "Abbrechen" klickt, leeres String wird zurückgegeben; in dem Fall soll es nicht übernommen werden
            return False        # palette refresh nicht notwendig, also False

        build_ele.Directory.value = new_directory

        return True             # palette refresh notwendig, um auf dem Button den neuen Ordnernamen anzuzeigen

Grüße,
Bart

Hallo Bart, gab es im unsichtbaren Button ein Kopierfehler?
Dieser ist nicht unsichtbar, und eine exakte Kopie vom Parameter oben.

Ich vermute mal wir brauchen hier einfach ein String Parameter, wo der Pfad abgespeichert wird, oder?

Sorry, mein Fehler. ich hab die "defekte" Darstellung gesehen und wollte das reparieren. was dann wohl komplett in die Hose gegangen ist.

Allplan Webentwicklung

Private messages must be private. No support request via Private message.

Vielleicht wäre es eine gute Idee, wenn der Text im Beitrag als "Code" markiert ist, die XML-Tags

< und >
zuzulassen, und nicht durch "Escapes" (&lt;&gt;) zu ersetzen!
Es kommt doch häufiger vor, gerade bei PythonParts, dass man XML-Code im Beitrag unterbringen möchte!

aktuell werden alle Tags, nicht nur XML Tags, aus den eingaben ENTFERNT.
für den Abschnitt CODE Funktioniert es nun wieder, wenn man den teil encoded im CODE abschnitt einträgt, dass die spitzen Klammern sichtbar sind.

das man den Abschnitt nciht mehr "encoden" muss sonder so direct

<tag> irgendwas </tag> 

direkt reinkopieren kann und die tags nicht aus sicherheitgründen entfernt werden, muss ich wieder aktivieren ...

Allplan Webentwicklung

Private messages must be private. No support request via Private message.

Für Personen, die hier auf den Foreneintrag kommen:

den ersten Parameter von Bart habe ich so übernommen,
als zweiter Parameter reicht wie gesagt einfach ein String, ich habe diesen statt unsichtbar, einfach disabled, damit der User sehen kann, welcher Pfad gewählt ist

Zitiert von: thesocialpotwal
den ersten Parameter von Bart habe ich so übernommen,
als zweiter Parameter reicht wie gesagt einfach ein String...

Genau. Es war ein Copy-Paste-Fehler. Hier ist, was ich mit einem "unsichtbaren Parameter" für den Pfad gemeint habe:

<Page>
  <Name>__HiddenPage__</Name>
  <Text/>
  <Parameters>
    <Parameter>
      <Name>Directory</Name>
      <Text/>
      <Value/>
      <ValueType>String</ValueType>
    </Parameter>
</Page>

Grüße,
Bart