मैं एक परियोजना और लंबी कहानी पर काम कर रहा हूं, मैंने खुद को ऐसी स्थिति में पाया जहां मैं अनिश्चित था कि डेटा की कितनी पंक्तियां मैं टिंकर फ्रेम पर डाल दूंगा। इसलिए मैंने एक लूप बनाया, लेकिन ऐसा करने में, मैं अपने जीवन के लिए यह नहीं खोज सकता कि अभी भी चेकबॉक्स का उचित उपयोग कैसे किया जाए, उनके कार्यों से जुड़ा हुआ है, और वेरिएबल्स जो सहसंबंधित हैं। प्रश्न में समस्या को फिर से बनाने के लिए लूप और प्रासंगिक कोड यहां दिया गया है:

import tkinter as tk #Just context figured could be useful

self = tk.Tk() #I used a class implementation that is irrelevant to the problem
#which is why there is such a poor name choice here


#functions
def update_selection(num):
            print(checkboxVars) #list of all checkbox variables from loop
            if checkboxVars[num].get() == 1: #get the variable and compare it to an expected value
                print(checkboxVars[num])
                passLabels[num].config(show="") #Find the appropriate Label to the var and show
            else:
                passLabels[num].config(show="•")#Find the appropriate Label to the var and hide
def aWrapper(num): #I thought putting a wrapper around it might help and it did not
            update_selection(indexes[num])

#
data = [["This", "List"],["That", "List"], ["Those", "Lists"]]
i = 1
compLabels = []
userLabels = []
passLabels = []
passVars = []
checkboxes = []
checkboxVars = []
indexes = []
for List in data: #This is a list of lists that organize data and where it came from --> Not the issue
            num = data.index(List) #way to save where data comes from
            indexes.append(num) #List out of loop 
            var = tk.IntVar() #For the checkboxes below
            newCompany = tk.Label(self, text= "Static text not important")
            compLabels.append(newCompany)#List out of loop 
            newCompany.grid(row=i, column=0)
            newUser = tk.Label(self, text="Static text")
            userLabels.append(newUser)
            newUser.grid(row=i, column=1)
            passvar = tk.StringVar()
            passvar.set("something")
            passVars.append(passvar)
            newpass = tk.Entry(self, textvariable=passvar, state="readonly", show="•")
            passLabels.append(newpass)
            newpass.grid(row=i,column=2)
            newCheckbox = tk.Checkbutton(self, onvalue=1, offvalue=0, variable=var, command= lambda: aWrapper(num))
            checkboxes.append(newCheckbox)
            newCheckbox.grid(row=i, column=3)
            checkboxVars.append(var)
            i += 1



#run code
self.mainloop()

केवल संदर्भ के लिए, लक्ष्य यह है कि प्रत्येक चेकबॉक्स पिछले की तरह व्यवहार करे, जहां यह मूल रूप से टेक्स्ट को टॉगल करने वाला स्विच है जो इसे • से पठनीय टेक्स्ट में संरेखित करता है। किसी भी अंतर्दृष्टि की बहुत सराहना की जाती है, अग्रिम धन्यवाद!

0
Packerbacker111 30 पद 2020, 00:47

2 जवाब

सबसे बढ़िया उत्तर

लूप के अंदर लैम्ब्डा का उपयोग करने के लिए आपको डेटा को इस तरह बांधना होगा:

newCheckbox = tk.Checkbutton(self, command = lambda num=num: aWrapper(num))

वैकल्पिक रूप से (और जो मैं पसंद करता हूं) लैम्ब्डा के बजाय आंशिक वस्तु का उपयोग करना है:

from functools import partial

newCheckbox = tk.Checkbutton(self, command=partial(aWrapper, num))

हालांकि, आपको वास्तव में की आवश्यकता है कि आप चेकबॉक्स के समूह, प्रविष्टियों के समूह आदि से अपनी सोच को पूरी पंक्ति का प्रतिनिधित्व करने वाली वस्तु बनाने और फिर पंक्तियों का एक समूह बनाने के लिए पुन: समायोजित करें। इस तरह प्रत्येक पंक्ति अपने संचालन को अपने पास रखती है।

1
Novel 30 पद 2020, 00:55

सबसे आसान तरीका है कि सूची में केवल चर और प्रविष्टियों को स्टोर करें, और फिर इंडेक्स को अपने फ़ंक्शन में पास करें जो पासवर्ड दिखाने को टॉगल करता है। जब मैं इसे लिखता हूं तो उस समस्या का समाधान करने के लिए एक और उत्तर होता है।

हालांकि, एक अन्य विकल्प एक वर्ग बनाना है जो एक पंक्ति का प्रतिनिधित्व करता है। फिर आप किसी भी प्रकार की सूची या अनुक्रमण का उपयोग किए बिना मूल्यों तक सीधे पहुंचने के लिए वर्ग विधियों का उपयोग कर सकते हैं। यह बेहतर समाधान है या नहीं यह आपके वास्तविक कार्यक्रम के बारे में अज्ञात विवरण पर निर्भर करता है।

तकनीक का वर्णन करने वाला एक मूल उदाहरण यहां दिया गया है:

class Row():
    def __init__(self, parent, row, new_company, new_user, new_pass, show=False):
        self.show_var = tk.BooleanVar(value=show)
        self.company = tk.Label(parent, text=new_company)
        self.user = tk.Label(parent)
        self.password = tk.Entry(parent, show="" if show else "*")
        self.checkbox = tk.Checkbutton(parent, onvalue=True, offvalue=False, variable=self.show_var, command=self.toggle)

        self.password.insert("end", new_pass)

        self.company.grid(row=row, column=0)
        self.user.grid(row=row, column=1)
        self.password.grid(row=row, column=2)
        self.checkbox.grid(row=row, column=3)

    def toggle(self):
        show = "" if self.show_var.get() else "*"
        self.password.configure(show=show)

यह आपके लूप को पढ़ने और समझने में बहुत आसान बनाता है:

for List in data: 
    row = Row(self, i, "Static text not important", "Static text", "something", show=False)
    i += 1
0
Bryan Oakley 30 पद 2020, 01:13