Seite 1 von 1

"Scale"-Widget und ".get"-Funktion

Verfasst: Mittwoch 27. Mai 2020, 14:08
von Neldela
Hallo, ich bin derzeit dabei ein Interface für die Kontrolle der Raspberry HQ Camera zu bauen.

In diesem Test will ich mit einem "Scale"-Widget welches nur Zahlen ausgibt eine Funktion der Kamera ansteuern (camera.awb_mode) dieser command benötigt aber fixe Begriffe.
Ich dachte es könntet wie folgt funktionieren, tut es aber nicht.

Ich wäre sehr dankbar, wenn jemand versteht wie ich das mein und mir helfen kann! :wink:

Code: Alles auswählen

from tkinter import *
root = Tk()
from time import sleep
from picamera import PiCamera
camera = PiCamera()




def wb_mode8():
    camera.awb_mode = 'horizon'

def wb_mode7():
    camera.awb_mode = 'flash'

def wb_mode6():
    camera.awb_mode = 'incandescent'
    
def wb_mode5():
    camera.awb_mode = 'flourescent'
    
def wb_mode4():
    camera.awb_mode = 'tungsten'
    
def wb_mode3():
    camera.awb_mode = 'shade'

def wb_mode2():
    camera.awb_mode = 'cloudy'
    
def wb_mode1():
    camera.awb_mode = 'sunlight'
    
def wb_mode0():
    camera.awb_mode = 'auto'

    

def wb_get(var):
    wb_mode_[wb_slider.get()]


          
wb_slider = Scale(root, from_=0, to=8, orient=HORIZONTAL, command=wb_get)                  
wb_slider.pack()



root.mainloop()

Re: "Scale"-Widget und ".get"-Funktion

Verfasst: Mittwoch 27. Mai 2020, 14:24
von Sirius3
*-Importe sollte man nicht benutzen, weil man unkontrolliert Namen in den eigenen Namensraum schaufelt. `tkinter` wird üblicherweise per `import tkinter as tk` importiert und alle Namen über tk.xyz angesprochen.
Code gehört nicht auf oberste Ebene und vor allem nicht mitten in die Importe.
`wb_mode_` wird nirgends definiert, wenn Du das so benutzen möchtest, dann mußt Du eine entsprechende Liste definieren. Hier würde ich aber gleich den Wert für awb_mode in der Liste merken.

Code: Alles auswählen

import tkinter as tk
from functools import partial
from picamera import PiCamera

WB_MODES = ['auto', 'sunlight', 'cloudy', 'shade', 'tungsten', 'flourescent', 'incandescent', 'flash', 'horizon']
    
def wb_get(camera, var):
    print(WB_MODES[var])
    camera.awb_mode = WB_MODES[var]

def main():
    root = tk.Tk()
    camera = PiCamera()
    wb_slider = tk.Scale(root, from_=0, to=8, orient=tk.HORIZONTAL, command=partial(wb_get, camera))
    wb_slider.pack()
    root.mainloop()
    
 if __name__ == '__main__':
    main()

Re: "Scale"-Widget und ".get"-Funktion

Verfasst: Mittwoch 27. Mai 2020, 14:41
von Neldela
Danke für die schnelle Antwort!

Ich verstehe nur folgendes nicht:
(sorry lerne derzeit erst Tkinter )

Code: Alles auswählen

if __name__ == '__main__':
    main()
     

Re: "Scale"-Widget und ".get"-Funktion

Verfasst: Mittwoch 27. Mai 2020, 14:58
von __deets__
Das ist der __main__ Guard den man immer haben sollte, weil man sonst beim import der datei automatisch code ausfuehrt. Und das ist doof.

Re: "Scale"-Widget und ".get"-Funktion

Verfasst: Mittwoch 27. Mai 2020, 15:00
von Sirius3
Irgendwo muß die Funktion `main` auch aufgerufen werden. Und durch das if wird garantiert, dass main nur aufgerufen wird, wenn die Datei als Skript verwendet wird. So kann man die selbe Datei auch als Modul verwenden, oder um Tests laufen zu lassen.