Отмените выбор виджета в функции обратного вызова в TKinter - PullRequest
0 голосов
/ 23 октября 2018

Я использовал TKinter в python2.

Мой код выглядит следующим образом.

from Tkinter import *  


class Application(Frame):
    def __init__(self, master=None,w=1000,h=600):
        Frame.__init__(self, master)
        self.createWidgets(master,w,h)

    def getRadio(self,widget):
        widget.deselect()


    def createWidgets(self, master,w,h):
        ConfigPane=Frame(master,bg='lightblue',width=int((w/6)*4),height=int(h/3),padx=5,pady=5)
        DisplayPane=Frame(master,bg='DarkOliveGreen1',width=int((w/6)*4),height=int((h/3)*2),padx=5,pady=5)
        HyperPane=Frame(master,bg='khaki1',width=int((w/6)*2),height=h,padx=5,pady=5)
        # layout all of the main containers
        root.grid_rowconfigure(0, weight=1)
        root.grid_rowconfigure(1, weight=1)        
        ConfigPane.grid(row=0,column=0,columnspan=4,rowspan=1, sticky=W+N)
        DisplayPane.grid(row=1,columnspan=4,rowspan=2, sticky=W+S)
        HyperPane.grid(row=0,column=5,columnspan=2,rowspan=3, sticky=E+N+S)
        # create the widgets for the top frame
        var=StringVar()
        RegNet = Radiobutton(ConfigPane, text='RegNet',variable=var,pady=10,padx=10,width=10,anchor='w',command=lambda:self.getRadio(RegNet))
        RegNet.grid(row=0,column=0)           
        InceptionNet = Radiobutton(ConfigPane, text='InceptionNet',variable=var,pady=1,padx=10,width=10,anchor='w',command=lambda:self.getRadio(InceptionNet))
        InceptionNet .grid(row=1,column=0)
        ResNet = Radiobutton(ConfigPane, text='ResNet',variable=var,pady=8,padx=10,width=10,anchor='w',command=lambda:self.getRadio(ResNet))
        ResNet.grid(row=2,column=0)  

if __name__ == "__main__":
    root = Tk()
    width = root.winfo_screenwidth()
    height = root.winfo_screenheight()
    root.geometry(str(width)+'x'+str(height))
    app = Application(master=root,w=width,h=height)
    app.master.title('Deep Learning Reconfigurable Platform')
    app.mainloop()
    root.destroy()

Когда я нажимаю радиокнопку, черная точка на кнопке должна исчезнуть, но это не так.«т.Как я могу заставить это работать?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Ключевые элементы:

  • "Var" должен быть определен в области видимости Class, если он не уничтожен при выходе из метода createWidget, и вам нужно будет перемещаться по виджетам, чтобы получитьвыбранный.
  • В RadioButtons отсутствует атрибут value, определяющий, какое значение должно быть установлено в "var" при выборе.

Вот обновленный код;обновлено для Python3 (изменено имя модуля tkinter)

from tkinter import *


class Application(Frame):
    var = None
    def __init__(self, master=None,w=1000,h=600):
        Frame.__init__(self, master)
        self.var = IntVar()
        self.var.set(1)
        self.createWidgets(master, w, h)

    def show_choice(self):
        #for widget in widgets:
         #   widget.deselect()
        print(self.var.get())
        return


    def createWidgets(self, master,w,h):
        ConfigPane=Frame(master,bg='lightblue',width=int((w/6)*4),height=int(h/3),padx=5,pady=5)
        DisplayPane=Frame(master,bg='DarkOliveGreen1',width=int((w/6)*4),height=int((h/3)*2),padx=5,pady=5)
        HyperPane=Frame(master,bg='khaki1',width=int((w/6)*2),height=h,padx=5,pady=5)
        # layout all of the main containers
        root.grid_rowconfigure(0, weight=1)
        root.grid_rowconfigure(1, weight=1)
        ConfigPane.grid(row=0,column=0,columnspan=4,rowspan=1, sticky=W+N)
        DisplayPane.grid(row=1,columnspan=4,rowspan=2, sticky=W+S)
        HyperPane.grid(row=0,column=5,columnspan=2,rowspan=3, sticky=E+N+S)
        # create the widgets for the top frame
        RegNet = Radiobutton(ConfigPane, text='RegNet',variable=self.var,pady=10,padx=10,width=10,anchor='w', value=1, command=self.show_choice)
        RegNet.grid(row=0,column=0)
        InceptionNet = Radiobutton(ConfigPane, text='InceptionNet',variable=self.var,pady=1,padx=10,width=10,anchor='w', value=2, command=self.show_choice)
        InceptionNet.grid(row=1,column=0)
        ResNet = Radiobutton(ConfigPane, text='ResNet',variable=self.var,pady=8,padx=10,width=10,anchor='w', value=3, command=self.show_choice)
        ResNet.grid(row=2,column=0)



if __name__ == "__main__":
    root = Tk()
    width = root.winfo_screenwidth()
    height = root.winfo_screenheight()
    root.geometry(str(width)+'x'+str(height))
    app = Application(master=root,w=width,h=height)
    app.master.title('Deep Learning Reconfigurable Platform')
    app.mainloop()
    # root.destroy()
0 голосов
/ 24 октября 2018

Каждой радиопереключателю требуется отдельный value, в противном случае все они имеют одинаковое значение и, следовательно, показывают одно и то же состояние.Значение - это то, как tkinter знает, какую кнопку в наборе кнопок следует выбрать.

Вы, вероятно, не должны вызывать deselect в обратном вызове - это делает ваши кнопки фактически бесполезными, поскольку любая попыткаВыбор пользователем приведет к тому, что все, на что он нажал, будет немедленно отменено.Им станет невозможно что-либо выбирать.

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