Получение значения из радиобокса в Tkinter - Python - PullRequest
2 голосов
/ 01 июля 2011

Я пытаюсь создать графический интерфейс в Python с использованием модуля Tkinter, и часть этого заключается в предоставлении пользователю возможности выбора двух радиобоксов и выбора того, который им нужен. В зависимости от того, какое поле они отмечают, он запускает разные функции, которые возвращают разные результаты - результаты, которые я затем хочу использовать вне класса окна. Но я не знаю, как отправить значение из класса в класс; Я уверен, что это довольно просто, но я не могу на всю жизнь решить это.

Мой текущий код:

class BatchIndiv():
def __init__(self, master):
    self.master=master
    self.startwindow()
    self.b=0

def startwindow(self):

    self.var1 = IntVar()
    self.textvar = StringVar()

    self.Label1=Label(self.master, text="Batch or indivdual import?")
    self.Label1.grid(row=0, column=0)

    self.Label2=Label(self.master, textvariable=self.textvar)
    self.Label2.grid(row=2, column=0)

    self.rb1 = Radiobutton(self.master, text="Batch", variable=self.var1,
                           value=1, command=self.cb1select)
    self.rb1.grid(row=1, column=0, sticky=W)

    self.rb2 = Radiobutton(self.master, text="Individual", variable=self.var1,
                           value=2, command=self.cb1select)
    self.rb2.grid(row=1, column=1, sticky=W)

    self.Button1=Button(self.master, text="ok", command=self.ButtonClick)
    self.Button1.grid(row=1, column=2)

def ButtonClick(self):
     if (self.var1.get())==1:
        b=BatchImport()
        return b
        self.master.quit()
        self.master.destroy()
     elif (self.var1.get())==2:
        b=IndivImport()
        return b
        self.master.quit()
        self.master.destroy()
     else: pass

def cb1select(self):
    return self.var1.get()

#End of class definition.
#Code:

root=Tk()
window=BatchIndiv(root)
b=BatchIndiv.ButtonClick.b
root.mainloop()

....

Рассматривайте функции BatchImport и IndividualImport как черные ящики, они просто возвращают целочисленное значение, которое я назначаю переменной b внутри ButtonClick (). Мне нужно это значение, чтобы сделать некоторые вещи ниже root.mainloop (), (т.е. где .... находится), но я не знаю, как его получить. Tkinter действительно раздражает, тем более, что у всех разные методы работы, поэтому онлайн-документация никогда не бывает одинаковой - пытался делать то, что было написано на разных, и это просто дало мне более приятные сообщения об ошибках.

Буду признателен за любую помощь.

PS - как я могу закрыть окно, когда кнопка нажата, и все же отправить значение b обратно остальной части кода, а не просто выйти из Python полностью? Как видите, я пытался использовать .quit () и .destroy (), но безуспешно.

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Ваша переменная b является локальной для вашего класса, поэтому в тот момент, когда ваш класс удаляется (после того, как вы выполните destroy или quit), b уничтожается.Поэтому определите переменную b как глобальную.

b = 0                    # this is now in the global namespace

class BatchIndiv():
    def __init__(self, master):
        self.master=master
        self.startwindow()
        #self.b=0      # no need for this, directly store in the global variable

    def startwindow(self):

        self.var1 = IntVar()
        self.textvar = StringVar()

        self.Label1=Label(self.master, text="Batch or indivdual import?")
        self.Label1.grid(row=0, column=0)

        self.Label2=Label(self.master, textvariable=self.textvar)
        self.Label2.grid(row=2, column=0)

        self.rb1 = Radiobutton(self.master, text="Batch", variable=self.var1,
                               value=1, command=self.cb1select)
        self.rb1.grid(row=1, column=0, sticky=W)

        self.rb2 = Radiobutton(self.master, text="Individual", variable=self.var1,
                               value=2, command=self.cb1select)
        self.rb2.grid(row=1, column=1, sticky=W)

        self.Button1=Button(self.master, text="ok", command=self.ButtonClick)
        self.Button1.grid(row=1, column=2)

    def ButtonClick(self):
        global b
        if (self.var1.get())==1:
            b=BatchImport()
            self.master.quit()
            #self.master.destroy()    # either quit or destroy, I think one is sufficient, but confirm to be sure.
        elif (self.var1.get())==2:
            b=IndivImport()
            self.master.quit()
            #self.master.destroy()    # either quit or destroy, I think one is sufficient, but confirm to be sure
         else: pass

    def cb1select(self):
        return self.var1.get()

#End of class definition.
#Code:

root=Tk()
window=BatchIndiv(root)
root.mainloop()

# now do here whatever you want to do with the variable b
print b

(использование глобальной переменной не очень хорошая идея, но, поскольку я не знаю, что вы хотите сделать с b, я не могу ничего предложить.)

1 голос
/ 01 июля 2011

Вообще говоря, после вызова mainloop у вас никогда не должно быть кода, это не совсем так, как работают программы с графическим интерфейсом.

Когда пользователь нажимает кнопку, вся работа должна выполняться (или начинаться с) команды для кнопки.Если вы затем хотите, чтобы программа вышла, вы уничтожаете корневое окно (что приводит к выходу из метода mainloop), и ваша программа завершается.Вы не должны запускать вещи после mainloop.

... и поэтому вопрос о том, как передавать данные с кнопок в код после mainloop, становится спорным.

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

ButtonClick затем становится примерно таким:

def ButtonClick(self):
    if self.var1.get()==1:
        b=BatchImport()

    elif self.var1.get()==2:
        b=IndivImport()

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