Чтение динамического c значения флажка в python Tkinter - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть следующий код, где я хотел, чтобы отображались значения выбранных флажков. Но вывод пуст. rxList содержит ['CAR1', 'CAR2', 'CAR3']

, и я хочу установить флажки с этими значениями и вернуть выбранные значения. Я не понимаю, почему он не читает выбранные значения checkox

Любые предложения высоко ценятся

def getSelections(rxList):
    window = Tk()
    global selections
    selections =[]
    for i in rxList:
        sel = StringVar()
        selections.append(sel)  
        cb = Checkbutton(window, text = i, variable = sel, onvalue = i, offvalue="None")
        cb.pack()
    btn = Button(window,text = "Next", command = showme)
    # btn1 = Button(window,text= )
    btn.pack()
    print(selections)
    window.mainloop()

def showme():
    for i in range(len(selections)):
        print("---selected values----",selections[i].get())

--- EDIT ----

У меня есть один GUI уже для выбора XML файла

НИЖЕ МОЙ КОД В main_window.py .....

from tkinter import *
from tkinter import filedialog
from tkinter import messagebox
import path
from ARXML_Parser import importARXML
from pathlib import Path
import os

read_file_path =''
dest_file_path = ''


def select_file():
    global read_file_path
    global dest_file_path
    file_path = ""
    file_path = filedialog.askopenfilename(initialdir = "/",title = "Select file",filetypes = (("ARXML files","*.arxml"),))
    name = Path(file_path).stem #return the file name
    f_name = os.path.basename(file_path)

    nn = name + '.h'
    if file_path!="":
        file_name.configure(state = 'normal')
        file_name.delete('1.0',END)
        file_name.insert('1.0', file_path)
        file_name.configure(state = 'disabled')

        d_f_name = re.sub(f_name,nn,file_path) # from file path replaces XXXX.arxml with XXXX.h
        dest_file_name.configure(state = 'normal')
        dest_file_name.delete('1.0',END)
        dest_file_name.insert(END, d_f_name)
        dest_file_name.configure(state = 'disabled')
        read_file_path = file_path.strip()
        dest_file_path = dest_file_name.get('1.0',END).strip()

def select_folder():
    global dest_file_path
    chk = file_name.get('1.0',END).strip()
    print(f'chk---{chk}++')
    print(type(chk))
    if chk.strip() != '':
        folder_path = ""
        folder_path = filedialog.askdirectory()
        f_path = file_name.get('1.0',END)
        f_name = Path(f_path).stem + '.h'

        if folder_path!="":
            folder_path = folder_path + '/' + f_name
            dest_file_name.configure(state = 'normal')
            dest_file_name.delete('1.0',END)
            dest_file_name.insert(END, folder_path)
            dest_file_path = folder_path.strip()
            dest_file_name.configure(state = 'disabled')

    else:
        messagebox.showerror("Error", "You should select a file first.")



def call_func():
    if read_file_path =='':
        messagebox.showerror('Error','You need to select a file first before hitting convert button !')
    else:
        ret = importARXML(read_file_path,dest_file_path)
        if ret ==1:
            messagebox.showinfo('Message', 'The file got converted !')
            # root.destroy()
        else:
            messagebox.showinfo('Error', 'There seems to be error with file !')
            root.destroy()


def createCheckBox(rxList):
    var = StringVar()
    for i in rxList:
       c = Checkbutton(root, text = i, variable =  var)
       c.pack()
    return 1


root = Tk()
# root.resizable(False,False)x

root.title("ARXML Code Gen")
# root.geometry('2000x1000')



frame =  LabelFrame(root)
frame_Checkbuttons = LabelFrame(root)

scroll = Scrollbar(frame_Checkbuttons)
scroll.pack(side = RIGHT, fill = Y)  


dummy_text = Label(frame,text = "   ")
dummy_text1 = Label(frame,text = "\n ")

dummy_text1.grid(row=0, column = 1)
dummy_text1.grid(row=1, column = 2)
dummy_text.grid(row=2, column = 3)

select_file_button = Button(frame,text = "Select ARXML file", command = select_file)
select_file_button.grid(row =4, column=0,padx =25,pady=25)

file_name = Text(frame,height=2, width = 90)
file_name.grid(row = 4, column = 3,padx =10,pady=25)


dummy_text1.grid(row=5, column = 0)

dest_folder_button = Button(frame,text = "Destination Folder", command = select_folder)
dest_folder_button.grid(row = 6, column = 0, padx = 25,pady=10)



dest_file_name = Text(frame,height=2, width = 90)
dest_file_name.grid(row = 6, column = 3,padx =10,pady=10)


dummy_text.grid(row =7, column = 0)

submit_button =  Button(frame,text = 'Convert ARXML to .h ',width =20,height = 1,command = call_func)
submit_button.grid(row = 10, column = 3,sticky=N, columnspan=2,pady=10)
lumn = 0)


frame.pack(padx=20,pady=20)
frame_Checkbuttons.pack(padx=20,pady=20)

root.mainloop()

Ниже приведен код моего парсера в ARXML_Parser.py ....


from pathlib import Path
from tkinter import *
from xml.dom import minidom
from time import sleep
from temp import *

from tkinter import messagebox

def importARXML(src_path,dest_path):
    ARXML = minidom.parse(src_path.strip())
    dest_path = dest_path.strip()
    print(src_path.strip())

    ********** File is Parsed from source path ************

    ***************     some       ********************\
    *************   functionality       ******************
    **************      to get Rx   **********************8

    # so here is my Rx
    window = Tk()
    app = MainApplication(window,Rx)

А ваш код, который вы мне прислали, хранится в файле с именем temp.py.

, потому что у нас есть два основных цикла ??

1 Ответ

0 голосов
/ 19 апреля 2020

Попробуйте что-то вроде этого

# Use Tkinter for python 2, tkinter for python 3
import tkinter as tk

class MainApplication:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)

        self.label = tk.Label(self.frame, text="Some selections")
        self.label.pack()

        self.getSelections(['CAR1','CAR2','CAR3','CAR4'])

        self.close_button = tk.Button(self.frame, text="Close", command=master.quit)
        self.close_button.pack()

        self.frame.pack()

    def getSelections(self,rxList):
        global selections
        selections =[]
        for i in rxList:
            sel = tk.StringVar()
            selections.append(sel)
            cb = tk.Checkbutton(self.frame, text = i, variable = sel, onvalue = i, offvalue="None")
            cb.pack()
        btn = tk.Button(self.frame,text = "Next", command = self.showme)
        # btn1 = tk.Button(self.frame,text= )
        btn.pack()
        print(selections)

    def showme(self):
        for i in range(len(selections)):
            print("---selected values----",selections[i].get())


if __name__ == "__main__":
    root = tk.Tk()
    app = MainApplication(root)
    root.mainloop()

В этом случае mainl oop () запускается как последняя команда, и ваш выбор заполняется, а кнопки «выполняются» заранее.

Вывод: Запуск python3 temp.py дает мне сначала только

[<tkinter.StringVar object at 0x109df8950>, <tkinter.StringVar object at 0x109e0be10>, <tkinter.StringVar object at 0x109e41ad0>, <tkinter.StringVar object at 0x109e41bd0>]

Терминал ждет, и в то же время вы должны увидеть окно tkinter:

enter image description here

Если я выберу первые две галочки и нажму «Далее», я получу следующий вывод

---selected values---- CAR1
---selected values---- CAR2
---selected values----
---selected values----

Редактировать: если у вас возникают проблемы с отображением текста кнопки, и на Ма c в темном режиме, это может быть эта проблема .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...