Odczytywanie wartości wielu pól wielokrotnego wyboru

0

Hej, pisze w sprawie dodania zawartości do listy ale ciągle dostaje błędne wyniki.

jak to poprawić aby zbierało z każdego a nie tylko z ostatniego.

checkbox_variables = []
#Checkbox
for row in zadania:
    variable = IntVar(window, 0)
    print(variable.get())
    Checkbutton (window, text=row, variable=variable, onvalue=1, offvalue=0, command=lambda  x=variable, y=variable: row ) .grid(column=0, sticky=W,padx=10)
    variable.trace('w', lambda *_: print("The value was changed"))


def send_mail():
    checkbox_variables.clear()
    for row in zadania:
       checkbox_variables.append(variable.get())
       print(checkbox_variables)
       if variable.get() == 1:
         print("tes")
    else:
            print("lipa")

Wyświetlenie tablicy:

0
0
0
0
The value was changed
The value was changed
[1]
tes
[1, 1]
tes
[1, 1, 1]
tes
[1, 1, 1, 1]
tes
lipa
The value was changed
[0]
[0, 0]
[0, 0, 0]
[0, 0, 0, 0]
lipa

Jak możecie zauważyć dla każdego jednego jest wychwytywana zmiana zawartości. ale łapię tylko ostatni. Jeżeli "zaznaczymy" ostatni checkbox to zawartość wszystkich się zmienia. Pomysły jak to zrobić aby każdy miał swoje miejsce a nie że jeden odpowiada za wszystkie?

2
Arkadiusz chodacki napisał(a):

Jak możecie zauważyć dla każdego jednego jest wychwytywana zmiana zawartości. ale łapię tylko ostatni.

Wszystko zgodnie z dokumentacją: https://book.pythontips.com/en/latest/for_-_else.html

0

Więc to jest kod który jest teraz:

#Checkbox
for row in zadania:
    global variable
    variable = IntVar(window, 0)
    Checkbutton (window, text=row, variable=variable, onvalue=1, offvalue=0, command=lambda  x=variable, y=variable: checkbox_variables ) .grid(column=0, sticky=W,padx=10)
    checkbox_variables.append(variable.get())

    variable.trace('w', lambda *_: print("The value was changed"))


def send_mail():
    print(checkbox_variables)
    for row in checkbox_variables:
        print(variable.get())
    # if variable.get() == 1:
         #  print("tes")
      #  else:
       #         print("lipa")

a to jest output, wartość jeden jest tylko uzyskiwana gdy ostatni checkbox jest zaznaczony. Dodatkowo checkbox_values nie zbiera informacji o zmianie tylko zapełnia się 0.

The value was changed
[0, 0, 0, 0, 0]
0
0
0
0
0
The value was changed
[0, 0, 0, 0, 0]
1
1
1
1
1
1

nazewnictwo to "kocioł" variable=variable
prawdopodobnie chodzi o to "for row in checkbox_variables:" "row" a w Checkbutton "variable=variable"

nie jestem w stanie odtworzyć twojego kodu, a zgadywać nie mam zamiaru
dla testu zmień sobie u mnie w funkcji "send_mail" for var na for row i sprawdź co się stanie

import tkinter as tk

def send_mail():
    result = []
    for var in checkbox_variables:
        result.append(var.get())
    print(result)
    
window = tk.Tk()
window.geometry('190x190')
window.resizable(0, 0)
window.title('Checkbox')

checkbox_variables = []

for i in range(4):
    var = tk.IntVar(window)
    check_button = tk.Checkbutton(window,text="Zadanie {}".format(i), variable=var, command=send_mail).grid(column=0, sticky='W',padx=10)
    
    checkbox_variables.append(var)
    
    var.trace('w', lambda *_: print("The value was changed"))

close_button = tk.Button(window, text="Close", command=window.quit)
close_button.grid(row=6,column=1, sticky='W', pady=2)

window.mainloop()

0

teraz pojawił się dziwny problem, uzywam for row in zadania: aby wyświetlić nazwy koło checkboxów - ale wyglądają one tak: ('zad1',). jakiś pomysł jak to poprwić? Replace. daje dziwne wyniki np jestem w stanie usunąć tylko " )"

import tkinter as tk

def send_mail():
    result = []
    for var in checkbox_variables:
        result.append(var.get())
    print(result)
    
window = tk.Tk()
window.geometry('250x160')
window.resizable(0, 0)
window.title('My favorite language')

checkbox_variables = []
zadania = ['C/C++','English Language','Python','Rust']

for this_row, var in enumerate(zadania):
    var = tk.IntVar(window)
    tk.Checkbutton(window, text=zadania[this_row], variable=var,
                   command=send_mail).grid(row=this_row,
                   column=0, sticky='w')
    checkbox_variables.append(var)

close_button = tk.Button(window, text="Close", command=window.quit)
close_button.grid(row=6,column=1, sticky='W', pady=2)

window.mainloop()


2

Twój kod jak dla mnie działa.
Poprawiłbym tylko na to co poniżej, jak już stosujesz enumerate:

  for this_row, name in enumerate(zadania):
    var = tk.IntVar(window)
    tk.Checkbutton(window, text=name, variable=var,
                   command=send_mail).grid(row=this_row,
                                           column=0, sticky='w')

oraz ewentualnie uprościł send_mail

def send_mail():
    result = map( lambda x: x.get(),  checkbox_variables)
    print(list(result))
0
Robert Karpiński napisał(a):

Twój kod jak dla mnie działa.
Poprawiłbym tylko na to co poniżej, jak już stosujesz enumerate:

  for this_row, name in enumerate(zadania):
    var = tk.IntVar(window)
    tk.Checkbutton(window, text=name, variable=var,
                   command=send_mail).grid(row=this_row,
                                           column=0, sticky='w')

oraz ewentualnie uprościł send_mail

def send_mail():
    result = map( lambda x: x.get(),  checkbox_variables)
    print(list(result))

Panowie, a macie moze pomysł jak zebrać tylko checkboxy tylko z wartościa 1 i dodanie ich jako suma wykonanych zadań?

if var==1:
   var.trace('w', lambda *_: wyk.append(1))

próbowałem podobnym kodem i udalo mi się zebrać 1 ale za kazdym razem gdy tylko zmieniala się wartość dodawało mi po 1 do listy czyli [1,1,1,1], nie patrząc na to czy wartość to 1 czy 0.

0

Poradziłem sobie z tym, ale wciąż męczę się z dziwnym outputem z bazy. czy mozna usunąć znaczki obok napisów? Generuje z bazy nazwy zadań obok checkboxów i aplikacje przez to wygląda brzydko.
Output:
('zad1',)
('zad2',)
('zad3',)
('zad4',)
('zad5',)

0

Poradziłem sobie z tym, ale wciąż męczę się z dziwnym outputem z bazy. czy mozna usunąć znaczki obok napisów? Generuje z bazy nazwy zadań obok checkboxów i aplikacje przez to wygląda brzydko.
Output:
('zad1',)
('zad2',)
('zad3',)
('zad4',)
('zad5',)

  1. robisz off-topic problem nie jest związany z tematem Odczytywanie wartości wielu pól wielokrotnego wyboru nowy problem nowy watek

do dopasowywania wzorców najlepiej służą wyrażenia regularne

import re
print("".join(list(filter(lambda x: x.isalpha() or x.isnumeric(),[(x) for x in ("('zad1',)")]))))  
0

i mam mały problem z formatowaniem tego ("('zad1',)" - wyświetla tylko zad 1 a generowane jest to z listy i chcialbym aby dla kazdego jedenego zadania bylo osobne formatowanie usuwające te znaki.{} i

import re

example = ["('zad1',)", "('zad2',)", "('zad3',)", "('zad4',)", "('zad5',)"]
#example = ["zad,   1", '{za[d]  -:=:-  dwa}', "~ ({zad}[3]) +-\*", "_/\/\  z.a,d,... :&X*'''"]

for x in example:
    print("original : {}".format(x))
        
print("\n")

for item in example:
    example = "".join(list(filter(lambda x: x.isalpha() or x.isnumeric() or x.isspace(),item)))
    example = re.sub("[A-Za-z]+", lambda x: " " + x[0] + " ", example)
    example = " ".join(example.strip().split())
    print("change : {}".format(example))

1 użytkowników online, w tym zalogowanych: 0, gości: 1