Zugriff auf Datei im selben Ordner

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Merkator
User
Beiträge: 151
Registriert: Sonntag 5. Dezember 2021, 17:15

Mein Code:

Code: Alles auswählen

import tkinter as tk 
from tkinter import ttk
import time
from subprocess import call
import security

# Fenster erstellen 
root = tk.Tk() 
root.geometry("1200x700") 

# Titel des Fensters 
root.configure(background='darkblue') 
root.title("Application")

# Mithilfe von CustomTKinter ein Label erstellen 
clock_label = ttk.Label(root, font=("Arial", 20, 'bold'), foreground="white", background="darkblue", borderwidth=3, relief="ridge")
clock_label.pack() 
clock_label.place(x=950, y=35) 

# Funktion um die Uhrzeit zu aktualisieren 
def tick():
    time2 = time.strftime("%H:%M:%S")
    clock_label.config(text=time2)
    clock_label.after(200, tick)
tick()

# Datum anzeigen 
date_label = ttk.Label(root, font=("Arial", 20, 'bold'), foreground="white", background="darkblue", borderwidth=3, relief="ridge")
date_label.pack() 
date_label.place(x=950, y=0) 
def show_date():
    date = time.strftime("%d/%m/%Y")
    date_label.config(text=date)
    date_label.after(200, show_date)
show_date()


 # Text oben in der Mitte  
txt_label = ttk.Label(root, font=("Arial", 20, 'bold'), foreground="white", background="darkblue", borderwidth=3, relief="ridge") 
txt_label.pack()  
txt_label.place(x=100, y=35)  
txt_label.config(text="Application")


# Bild definieren
image = tk.PhotoImage(file='schloss.png')

# Programm definieren, das gestartet werden soll
programm = 'security.py'

# Funktion definieren, die beim Klicken auf das Bild aufgerufen wird
def startProgramm(event):
    call(programm)

# Event an das Bild binden
label = tk.Label(root, image=image)
label.bind("<Button-1>", startProgramm)

label.pack()


# Fenster schließen 
root.mainloop()


Meine Probleme:

1. Das Bild schloss.png soll an 200x100 verschoben werden
2. Das Programm security.py wird anscheinend nicht erkannt, obwohl es im selben Ordner ist


Über eine schnelle Antwort würde ich mich freuen
Merkator
User
Beiträge: 151
Registriert: Sonntag 5. Dezember 2021, 17:15

Achso und

3. Das Bild schloss.png soll verkleinert werden
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Man gibt keine Fenstergröße fest vor und benutzt kein `place`, vor allem nicht, wenn man vorher schon `pack` aufgerufen hat.
Globale Variablen benutzt man nicht, alles was ein Programm braucht, wird über seine Argumente übergeben.
`subprocess.call` benutzt man nicht mehr, statt dessen subprocess.run. Das Argument muß eine Liste sein. Langlaufende Skripte darf es bei GUIs nicht geben. Das security.py muß also möglichst sofort wieder beendet sein.
Wenn man ein Label hat, das sich wie ein Button verhalten soll, dann benutzt man gleich einen Button.
Der Kommentar "Fenster schließen" ist falsch.
Wenn man etwas relativ zur Python-Datei referenzieren will, benutzt man __file__.

Es ist komisch, dass das Modul "security" importiert wird, aber auch gleichzeitig als Skript aufgerufen wird? Was macht das Modul bzw. Skript?

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk
import datetime
import subprocess
from pathlib import Path

BASEPATH = Path(__file__).parent

# Funktion um die Uhrzeit zu aktualisieren 
def update_datetime(clock_label, date_label):
    now = datetime.datetime.now()
    clock_label['text'] = f"{now:%H:%M:%S}"
    date_label['text'] = f"{now:%d/%m/%Y}"
    clock_label.after(200, update_datetime, clock_label, date_label)

def start_programm():
    subprocess.run([BASEPATH / "security.py"])

def main():
    root = tk.Tk()
    root.title("Application")
    root.configure(background='darkblue')

    clock_label = ttk.Label(root, font=("Arial", 20, 'bold'), foreground="white", background="darkblue", borderwidth=3, relief="ridge")
    clock_label.pack()
    date_label = ttk.Label(root, font=("Arial", 20, 'bold'), foreground="white", background="darkblue", borderwidth=3, relief="ridge")
    date_label.pack()
    update_datetime(clock_label, date_label)

    txt_label = ttk.Label(root, text="Application", font=("Arial", 20, 'bold'), foreground="white", background="darkblue", borderwidth=3, relief="ridge")
    txt_label.config()

    image = tk.PhotoImage(file=BASEPATH /'schloss.png')
    button = tk.Button(root, image=image, command=start_programm)
    button.pack()
    root.mainloop()

if __name__ == "__main__":
    main()
Merkator
User
Beiträge: 151
Registriert: Sonntag 5. Dezember 2021, 17:15

Das Script soll ein neues Tkinter fenster erzeugen, dass alte wird im nachhinein geschlossen.
Merkator
User
Beiträge: 151
Registriert: Sonntag 5. Dezember 2021, 17:15

PermissionError: [Errno 13] Permission denied: PosixPath('/home/peerpri07/Python/Application/security.py')
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ist das die richtige Datei, und hat sie die richtigen Berechtigungen, und hat sie ein shebang? Und versuchst du schon wieder mad hax0r tools zu schreiben?
Merkator
User
Beiträge: 151
Registriert: Sonntag 5. Dezember 2021, 17:15

Ja es ist die richtige Datei, ich weiß nicht wie ich der Datei die Berechtigung geben kann, ich weis nicht wie ich der ein shebang geben kann. Und Nein, versuche ich nicht. Nur Tkinter Programm
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kannst du das Programm auf der Kommandozeile genau so ausfuehren? Und den Begriff shebang darfst du mal in google werfen, um zu lernen, was das ist, und wie man es richtig macht. Wer hacken will, muss Probleme selber loesen...
Merkator
User
Beiträge: 151
Registriert: Sonntag 5. Dezember 2021, 17:15

Ich will doch garnicht hacken??? Ich will ein normales Tkinter Programm schreiben
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Man startet keine externen Python-Programme, wenn man auch ganz einfach die Funktionalität über ein Modul bereitstellen kann.
Wenn ich Dich richtig verstanden habe, soll `security` einfach ein neues Fenster aufmachen. Das macht man per tk.Toplevel. Der Weg über ein weiteres Programm ist meist falsch.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Merkator: Ja klar, normales Programm das bildschirmfüllend wie ein Anmeldebildschirm aussieht wo der Benutzer dann seine Zugangsdaten eingibt, von der Person die ihre Projekte immer PasswordStealer nennt, auch wenn die was ganz anderes machen. 🙄
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Merkator
User
Beiträge: 151
Registriert: Sonntag 5. Dezember 2021, 17:15

Sirius3 hat geschrieben: Montag 6. Februar 2023, 21:32 Man startet keine externen Python-Programme, wenn man auch ganz einfach die Funktionalität über ein Modul bereitstellen kann.
Wenn ich Dich richtig verstanden habe, soll `security` einfach ein neues Fenster aufmachen. Das macht man per tk.Toplevel. Der Weg über ein weiteres Programm ist meist falsch.
ok danke. Wie mache ich das Bild denn Kleiner und verschiebe es an eine bestimmte stelle
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum nimmst Du nicht gleich eine verkleinerte Version? Die Position des Bildes ergibt sich ja aus der Position des Buttons, und die ergibt sich aus dem Layout, so dass alle Elemente richtig angeordnet werden, da mußt Du also nichts selbst verändern. Mach ein sauberes Layout und gut ist.
Merkator
User
Beiträge: 151
Registriert: Sonntag 5. Dezember 2021, 17:15

Naja im Grunde werde ich am ende 8 Bilder haben die im kreis angeordnet sind. Da weis ich halt nicht wie ich das dann gut darstellen kann
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Ah, solangsam kommen wir dem Problem näher. Für graphische Ausgaben gibt es in Tk das Canvas.
Merkator
User
Beiträge: 151
Registriert: Sonntag 5. Dezember 2021, 17:15

ok schaue ich mir an danke
Antworten