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

Fragen zu Tkinter.
Antworten
Neldela
User
Beiträge: 8
Registriert: Mittwoch 27. Mai 2020, 13:56

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()
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

*-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()
Neldela
User
Beiträge: 8
Registriert: Mittwoch 27. Mai 2020, 13:56

Danke für die schnelle Antwort!

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

Code: Alles auswählen

if __name__ == '__main__':
    main()
     
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist der __main__ Guard den man immer haben sollte, weil man sonst beim import der datei automatisch code ausfuehrt. Und das ist doof.
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Antworten