Проблема с place_forget () - PullRequest
       1

Проблема с place_forget ()

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

Я пытался заставить .place_forget () работать в моем тестовом приложении, но у меня возникли некоторые трудности.

Я пытаюсь получить виджеты в "def select_1:", чтобы показать, когда R1 " Да, флажок установлен, и тогда виджеты не будут отображаться при снятии флажка. Виджеты отображаются, когда я ставлю флажок, но не забываем (скрываем), когда флажок снят.

Любая помощь будет принята с благодарностью.

import os, sys
import pywintypes
from tkinter import *

#================================= MAIN WINDOW =================================
root = Tk()
w = 750
h = 325
ws = root.winfo_screenwidth()
hs = root.winfo_screenheight()
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)
root.geometry('%dx%d+%d+%d' % (w, h, x, y))
root.title('Test Application')
root.geometry('750x325')
root.config(bg='#000000')

pass_entry=StringVar()
pass_1=StringVar()
var1 = IntVar()
var2 = IntVar()
selection = StringVar()

#=================================== HEADER ====================================
header = Label(root, font = ('Times New Roman','25','bold'), text='Test Application',
                bg = ('#000000'), fg = ('#B3CDE0'))
header.place(x=250,y=15)

#================================ RESULT WINDOW ================================
result_window = Text(root, width = 80, height = 10)
result_window.place(x=50, y=75)

#=========================== CHECK BUTTON SELECTION ============================
def select_1():
    if var1.get()==1:
        pass_entry = Entry(root, width = 20, textvariable = pass_1, bg='#000000', fg='#B3CDE0')
        pass_entry.place(x=250,y=275)
        pass_entry.focus_set()

        selection = Label(root, text='Enter OS Password:', bg='#000000', fg='#B3CDE0')
        selection.place(x=140,y=275)

    elif var1.get()==0:
        pass_entry.place_forget()
        selection.place_forget()
    else:
        return

#========================= ACCESS CREDENTIAL MANAGER ===========================
def getpass():
    if var1.get()==1:
        os.system('explorer.exe')
    else:
        return

def close():
    root.destroy()

#=============================== RADIO BUTTONS =================================
R1 = Checkbutton(root, text="Yes", variable = var1, onvalue = 1, offvalue = 0, height=1, width = 15,           activebackground = '#000000', bg='#000000', fg='#B3CDE0', command=select_1)
R1.place(x=350,y=250)

 R2 = Checkbutton(root, text="No ", variable = var2, onvalue = 1, offvalue = 0, height=1, width =      15, bg='#000000', fg='#B3CDE0', activebackground = '#000000')
 R2.place(x=350,y=275)

#=========================== RADIO BUTTON SELECTION ============================
cancel_button = Button(root, text='Cancel', width = 12, bg=('#000000'), fg = ('#B3CDE0'),     activebackground = '#000000', command = close)
cancel_button.place(x=590,y=270)

recover_button = Button(root, text='Open', width = 12, bg=('#000000'), fg = ('#B3CDE0'), activebackground = '#000000',command = getpass)
recover_button.place(x=480,y=270)

root.mainloop()

1 Ответ

3 голосов
/ 21 апреля 2020

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

#=========================== CHECK BUTTON SELECTION ============================
    pass_entry = Entry(root, width = 20, textvariable = pass_1, bg='#000000', fg='#B3CDE0')
    selection = Label(root, text='Enter OS Password:', bg='#000000', fg='#B3CDE0')

    def select_1():
        if var1.get()==1:
            pass_entry.place(x=250,y=275)
            pass_entry.focus_set()

            selection.place(x=140,y=275)

        elif var1.get()==0:
            pass_entry.place_forget()
            selection.place_forget()
        else:
            return

Обратите внимание, как pass_entry и selection определены вне функции и размещены только внутри функции.

Хотя немного странно, почему вы используете две отдельные кнопки для "да" и " нет ", если проверка их не снимает автоматически другую (я полагаю, что цель этих двух кнопок).

Если это то, что вы хотите сделать, вы должны использовать вместо этого виджет Radiobutton. Обратите внимание, как они оба влияют на одну и ту же переменную, и у каждого из них есть одно значение.

#=============================== RADIO BUTTONS =================================
R1 = Radiobutton(root, text="Yes", variable = var1, value = 1, height=1, width = 15, activebackground = '#000000', bg='#000000', fg='#B3CDE0', command=select_1)
R1.place(x=350,y=250)

R2 = Radiobutton(root, text="No", variable = var1, value = 0, height=1, width = 15, activebackground = '#000000', bg='#000000', fg='#B3CDE0', command=select_1)
R2.place(x=350,y=275)

Я также немного прибрался в других опциях, у вас там был некоторый случайный интервал.

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