Aufruf einer Funktion in Radiobutton verlangt unbekanntes Argument

Fragen zu Tkinter.
Antworten
hlech65730
User
Beiträge: 4
Registriert: Samstag 10. Februar 2018, 19:28

Sonntag 29. April 2018, 19:45

Hello @all,

ich habe folgendes Problem in einer Klassendefinition :

# Tkinter
# Definition einer Klasse Schalter

from Tkinter import *

root = Tk()
v = IntVar()
canvas_width = 50
canvas_height = 50

sqr_gry_arrow_red_img = PhotoImage(file="Rechteck_grau_mit_Pfeil_rot_klein.gif")
sqr_gry_circle_grn_img = PhotoImage(file="Rechteck_grau_mit_Kreis_durchstrichen_gruen_klein.gif")





class Schalter:

def upper_radio_button_pressed(self):
self.canvas = Canvas(root, width=canvas_width, height=canvas_height)
self.canvas.create_image(10,10, anchor=NW, image=sqr_gry_arrow_red_img)
self.canvas.place(x = 150, y = 40, width=50, height=50)

Radiobutton(root,
text="Schalter ON",
padx = 10,
variable=v,
value=1,
command=upper_radio_button_pressed).place(x = 20,
y = 30, width=100, height=30)

def lower_radio_button_pressed(self):
self.canvas = Canvas(root, width=canvas_width, height=canvas_height)
self.canvas.create_image(10,10, anchor=NW, image=sqr_gry_circle_grn_img)
self.canvas.place(x = 150, y = 40, width=50, height=50)

Radiobutton(root,
text="Schalter OFF",
padx = 10,
variable=v,
value=2,
command=lower_radio_button_pressed)place(x = 20,
y = 70, width=120, height=30)

def __init__(self):
self.lower_radio_button_pressed()




schalter_1 = Schalter()

def main():

# width x height + x_offset + y_offset:
root.geometry("500x200+30+30")
root.mainloop()




if __name__ == '__main__':
main()



innerhalb der Radiobuttons gibt es den Aufruf der Funktionen :

command=lower_radio_button_pressed bzw. command=upper_radio_button_pressed

das führt dazu, dass wenn man den Button betätigt eine Fehlermeldung kommt :

exception in Tkinter callback
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1536, in __call__
return self.func(*args)
TypeError: upper_radio_button_pressed() takes exactly 1 argument (0 given)

ich habe schon verschiedenes ausprobiert : nur ( ) oder ( self )
oder self.upper_radio_... leider alles ohne Erfolg. Die Funktionen upper_radio_button_pressed() und lower_radio_button_pressed() haben
aber keine Parameter, deshalb verstehe ich das nicht. ich kann hier keine Dateien anhängen ( finde jedenfalls nichts ). Die GIFS sind kleine selbstkreierte Symbole mit 25x25 Punkte spielt keine Rolle, könnt Ihr selbst erzeugen.
Kann mir jemand helfen ? Vielen Dank !
H.Lech
Benutzeravatar
wuf
User
Beiträge: 1497
Registriert: Sonntag 8. Juni 2003, 09:50

Montag 30. April 2018, 11:17

Hi hlech65730

Ich nehme an dein Skript wie es hier in unserem Forum präsentiert wird sieht in deinem Editor zuhause anders aus. Versuche deine Skripts in den hierfür zur Verfügung stehenden Code-Tags ins Forum zu stellen. Da dein Skript nicht direkt testbar war habe ich selber ein lauffähiges Skript erstellt, dass etwa in der Funktion deinem entspricht:

Code: Alles auswählen

# -*- coding: utf-8 -*-
try:
    # Tkinter for Python 2.xx
    import Tkinter as tk
except:
    # Tkinter for Python 3.xx
    import tkinter as tk

APP_TITLE = "Schalter"
APP_XPOS = 30
APP_YPOS = 30
APP_WIDTH = 300
APP_HEIGHT = 100

CANVAS_WIDTH = 50
CANVAS_HEIGHT = 50


class Schalter(tk.Frame):

    def __init__(self, app_win):
        self.app_win = app_win
        tk.Frame.__init__(self, app_win)
        
        self.sqr_gry_arrow_red_img = tk.PhotoImage(
            file="Rechteck_grau_mit_Pfeil_rot_klein.gif")
        self.sqr_gry_circle_grn_img = tk.PhotoImage(
            file="Rechteck_grau_mit_Kreis_durchstrichen_gruen_klein.gif")
                
        radio_button_frame = tk.Frame(self)
        radio_button_frame.pack(side='left', expand=True)
        
        self.var = tk.IntVar()
        tk.Radiobutton(radio_button_frame, text="Schalter ON",padx=10, 
            variable=self.var, value=1, command=self.upper_radio_button_pressed
            ).pack(anchor='w')
            
        rb = tk.Radiobutton(radio_button_frame, text="Schalter OFF", padx=10,
            variable=self.var, value=2, command=self.lower_radio_button_pressed)
        rb.pack(anchor='w')

        self.canvas = tk.Canvas(self, width=CANVAS_WIDTH, height=CANVAS_HEIGHT)
        self.canvas.pack(side='left', expand=True)
        
        self.canvas.create_image(10, 10, anchor='nw', tag="Schaltersymbol")
        
        rb.invoke()
        
    def lower_radio_button_pressed(self):
        self.canvas.itemconfig(
            "Schaltersymbol", image=self.sqr_gry_circle_grn_img)
        
    def upper_radio_button_pressed(self):
        self.canvas.itemconfig(
            "Schaltersymbol", image=self.sqr_gry_arrow_red_img)
                   
def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)
    app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    #app_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    
    app = Schalter(app_win)
    app.pack(fill='both', expand=True)
    
    app_win.mainloop()
 
 
if __name__ == '__main__':
    main()
Viel Spass beim ausprobieren.
Gruss wuf :wink:
Take it easy Mates!
hlech65730
User
Beiträge: 4
Registriert: Samstag 10. Februar 2018, 19:28

Donnerstag 3. Mai 2018, 19:57

Hallo Wuf,

danke !! Das mit den Code-Tags muss ich noch lernen. Bin neu hier im Forum und auch in Python ( bisher nur C für µController ),
nicht mal objektorientiert. Ich verwende Geany als IDE, bietet zwar wenig Funktion, braucht man sich aber auch nicht gross einarbeiten.
Könnte sein , dass ich noch ein paar Fragen zu Deinem Code habe, werde ihn erst mal ausprobieren, vielen Dank !
Antworten