Python Tkinter удаляет предыдущие виджеты при обновлении вывода - PullRequest
0 голосов
/ 08 января 2019

Я новичок в tkinter, но не в Python, и я работал над тем, чтобы взять один из моих старых кодов и поместить его в приятный графический интерфейс. Мой текущий код состоит из выпадающих меню, где после ввода материала вы нажимаете кнопку, которая указывает на другую функцию, которая выполняет некоторые вычисления и выводит флажки под ней.

Моя проблема заключается в том, что когда я изменяю эти начальные варианты, варианты с чекбоксом до того, как остаться, а новые просто идут под ним, что позже испортит остальную часть кода. Я возился с frame.grid_forget () в начале функции с флажками, но не могу заставить его работать.

Я думал, что делаю что-то вроде:

def click1(self):
    frame4=Frame(self.window)
    frame4.grid()
    frame4.grid_forget()
    frame4.grid()

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

Ответы [ 2 ]

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

В Tkinter доступны управляющие переменные, которые позволяют вам контролировать то, что появляется в виджетах, на основе содержимого переменных.

tk.StringVar (as used below)
tk.DoubleVar can hold a Float
tk.IntVar can hold an int

Они позволяют изменять содержимое виджетов, не разрушая и не воссоздавая. Ваш вопрос относится к флажкам, которые будут связаны с IntVars.

Ниже приведен код для отображения метки, которая увеличивает счетчик при каждом нажатии кнопки.

import tkinter
from tkinter import *

class GUI:
    def __init__(self):
        self.window=Tk()
        self.frame=Frame(self.window)
        self.frame.grid()
        # Define something to change on click.
        self.count=0
        # Create a StringVr to hold it.
        self.label_text=StringVar()
        # Link to a label
        self.label_text.set("Count = "+str(self.count))
        Label(self.frame, textvariable=self.label_text).grid()
        Button(self.frame,text="Click", command=self.on_click).grid()
        tkinter.mainloop()

    def on_click(self):
        # Update Count and the label on click 
        self.count+=1
        self.label_text.set("Count = "+str(self.count))

GUI()

Надеюсь, это поможет

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

Я еще не получил ни одного ответа, но для справки всех, я поиграл еще немного и нашел ответ:

import tkinter
from tkinter import *

class GUI:
  def __init__(self):
    self.window=Tk()
    self.frame=Frame(self.window)
    self.inner=Frame(self.window)
    self.frame.grid()
    self.inner.grid()
    Button(self.frame,text="Click",command=self.clear).grid()
    tkinter.mainloop()
  def click(self):
    self.inner=Frame(self.frame)
    self.inner.grid()
    Label(self.inner,text='Hello!').grid()
  def clear(self):
    self.inner.destroy()
    self.click()



GUI()

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

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