Флажок всегда показывает 0 во всплывающем окне - Tkinter - PullRequest
0 голосов
/ 08 января 2019

У меня есть графический интерфейс, использующий Tkinter, у него есть главный экран, а затем, когда вы нажимаете кнопку, появляется всплывающее окно, где вы выбираете кнопку-флажок, а затем вам будет отправлено электронное письмо. Независимо от того, что я делаю, я не могу прочитать значение этой кнопки как 1 или True, оно всегда = 0 или False.

Это мой код:

import tkinter as tk
from tkinter import *
import time
root = tk.Tk()
root.title('Status')
CheckVar1 = IntVar()
def email():
    class PopUp(tk.Tk):
        def __init__(self):
            tk.Tk.__init__(self)

            popup = tk.Toplevel(self, background='gray20')
            popup.wm_title("EMAIL")
            self.withdraw()
            popup.tkraise(self)
            topframe = Frame(popup, background='gray20')
            topframe.grid(column=0, row=0)

            bottomframe = Frame(popup, background='gray20')
            bottomframe.grid(column=0, row=1)

            self.c1 = tk.Checkbutton(topframe, text="Current", variable=CheckVar1, onvalue=1, offvalue=0, height=2, width=15, background='gray20', foreground='snow', selectcolor='gray35', activebackground='gray23', activeforeground='snow')
            self.c1.pack(side="left", fill="x", anchor=NW)           
            label = tk.Label(bottomframe, text="Please Enter Email Address", background='gray20', foreground='snow')
            label.pack(side="left", anchor=SW, fill="x", pady=10, padx=10)
            self.entry = tk.Entry(bottomframe, bd=5, width=35, background='gray35', foreground='snow')
            self.entry.pack(side="left", anchor=S, fill="x", pady=10, padx=10)
            self.button = tk.Button(bottomframe, text="OK", command=self.on_button, background='gray20', foreground='snow')
            self.button.pack(side="left", anchor=SE, padx=10, pady=10, fill="x")

        def on_button(self):
            address = self.entry.get() 
            print(address)
            state = CheckVar1.get()
            print (state)
            time.sleep(2)
            self.destroy()


    app = PopUp()
    app.update()

tk.Button(root, 
            text="EMAIL", 
            command=email, 
            background='gray15', 
            foreground='snow').pack(side=tk.BOTTOM, fill="both", anchor=N)

screen = tk.Canvas(root, width=400, height=475, background='gray15')
screen.pack(side = tk.BOTTOM, fill="both", expand=True)


def latest():
    #Other code
    root.after(300000, latest)
root.mainloop()

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

Я пытался:

CheckVar1 = tk.IntVar() - Безуспешно

self.CheckVar1 & self.CheckVar1.get() - Безуспешно

Удаление self.withdraw() - Безуспешно

У меня только один root.mainloop() в скрипте, я использую app.update() для всплывающего окна, потому что без этого оно не откроется.

Я проверил эти существующие вопросы для решения, и ни один не помог: Self.withdraw - Невозможно заставить кнопку tkinter нормально работать при запуске в качестве скрипта Self.CheckVar1 - Переменная флажка TKInter всегда 0 Только один экземпляр mainloop () - Значение кнопки Python tkinter всегда равно 0

Я также проверил очень похожие вопросы, но не собирался публиковать их все.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

из-за переменной области действия

попробуйте поместить CheckVar1 = IntVar () внутри класса

используйте его с собой, как это

self.CheckVar1 = tk.IntVar() # object of int

self.CheckVar1.set(1) # set value

variable=self.CheckVar1 # passing to the checkbutton as parameter 

state = self.CheckVar1.get() # getting value 
0 голосов
/ 08 января 2019

Проблема в том, что у вас есть два корневых окна. Каждое корневое окно получает свой собственный внутренний интерпретатор tcl, а виджеты и переменные tkinter в одном полностью невидимы для другого. Вы создаете IntVar в первом корневом окне, а затем пытаетесь связать его с кнопкой выбора во втором корневом окне. Это не может работать. В программе tkinter всегда должен быть только один экземпляр Tk.

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