Tkinter Button click Problem

Fragen zu Tkinter.
Antworten
HoLaHe
User
Beiträge: 15
Registriert: Montag 11. Juli 2022, 07:46

Hallo Ich bin noch python Anfänger und habe mir unten aufgeführte Script gebaut. Leider wird das ###MAKING GET REQUEST### ohne click des Buttons aufgeführt. Was mach ich falsch? :cry:

import requests
from requests.auth import HTTPBasicAuth
from datetime import datetime
from tkinter import messagebox
import pytz
import subprocess
import os
import sys
from tkinter import *
root=Tk()
root.geometry('300x300')
root.title('ACBackup - powerd by ')
a = Label(root, text="Welcome to AC Backup")
a.pack()

#def backup():
# os.system('backup.py')

# Create a Button

btn = Button(root, text='Start Backup', bd='5', command=response)

# Set the position of button on the top of window.
btn.pack(side='top')


##IGNORE SSL WARNING###
from requests.packages.urllib3.exceptions import InsecureRequestWarning

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
#######################

###GETTING TIME IN IST FORMAT####
IST = pytz.timezone('Europe/Berlin')
datetime_ist = datetime.now(IST)
current_datetime = datetime_ist.strftime('%d%m%Y_%H%M')
#######################

##AUDIOCODES SBC IP ADDRESS##
url = "192.168.12.245"
#######################

###MAKING GET REQUEST###
response = requests.get('https://' + url + '/api/v1/files/ini', auth=HTTPBasicAuth('Admin', '12345'), verify=False)


if response.status_code == 200:
with open(url + "_" + current_datetime + "_backup.ini", "w") as f:
f.write(response.text)
f.close()
print("Successfully backed up the INI file")
messagebox.showinfo("Backup Erfolgreich", 'Successfully backed up the INI file')
else:
print("Backup has been failed with an error status of", response.status_code)
print("Error Description is: ", response.text)

root.mainloop()
Benutzeravatar
Dennis89
User
Beiträge: 1376
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

wenn du mit 'command' etwas aufrufen willst, dann muss das eine Funktion sein, kein Namen.
Alles was auf Modulebene steht (ohne Einrückungen) wird beim Programmstart sofort ausgeführt. Da man das nicht will und da das auch zu deinem Problem geführt hat, gehört jeder ausführbare Code in eine Funktione, die bei Bedarf aufgerufen wird.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

Für Anfänger: *-Importe sind böse, weil sie eine unkontrollierte Menge an Namen in den eigenen Namensraum schaufeln. Das macht den Code schwer nachvollziehbar, woher welcher Name kommt.
Tk-Inter wird üblicherweise als `import tkinter as tk` eingebunden und alle Namen per tk.-Präfix angesprochen.

Auf oberster Ebene darf es keinen ausführbaren Code geben. Das verhindert, dass man globale Variablen benutzt, dass Code und Funktionsdefinitionen wild gemischt werden und dass man die Programme nicht sinnvoll testen kann.

Variablennamen müssen aussagekräftig sein, und dürfen keine Abkürzungen enthalten. `a` für ein Label? IST für mItteleurpäiSche zeiT?
Strings setzt man nicht mit + zusammen, auch keine URLs. Credentials werden am besten als Konstanten an den Anfang der Datei geschrieben (wenn überhaupt).
Wenn man with benutzt, dann braucht man kein `close`.

Bei mir fliegt das Programm mit der Meldung raus, dass `response` zum Zeitpunkt, wo der Button definiert wird, gar nicht exisitiert.
command braucht eine Funktion als Argument. Du hast aber gar nirgends eine Funktion definiert.
Antworten