Python-сообщество
- Начало
- » GUI
- » Tkinter, PyQt. Как скрыть виджет-элемент, а потом снова отобразить его?
#1 Янв. 21, 2013 11:46:49
plustilino Зарегистрирован: 2011-08-01 Сообщения: 9 Репутация: 0 Профиль Отправить e-mail
Tkinter, PyQt. Как скрыть виджет-элемент, а потом снова отобразить его?
Есть группа радиокнопок. При переключении требуется, чтобы одни поля и метки скрывавись, а другие отображались. Можно ли как-нибудь это сделать в Тkinter?
Про свойство state=DISABLED | NORMAL знаю. Но это не то: элементы отключаются, а не скрываются.
И заодно как это делается в PyQT?
#2 Янв. 21, 2013 11:51:12
mironich От: Зарегистрирован: 2011-05-23 Сообщения: 118 Репутация: 2 Профиль Отправить e-mail
Tkinter, PyQt. Как скрыть виджет-элемент, а потом снова отобразить его?
И заодно как это делается в PyQT?
Без кода не понятно что к чему, но вообще вызвать у нужного виджета hide()
Если они в чем-то вроде QGroupBox то можно только у него hide вызвать, остальные автоматом спрячуться.
#3 Янв. 21, 2013 17:49:57
4kpt От: Харьков Зарегистрирован: 2010-11-03 Сообщения: 998 Репутация: 63 Профиль Отправить e-mail
Tkinter, PyQt. Как скрыть виджет-элемент, а потом снова отобразить его?
Tkinter — можно и даже нужно. Есть три основных варианта:
Вариант первый:
1. Создаем рамку и пакуем туда все кнопки.
2. Рамку размещаем любым методом.
3. Используем метод имя_рамки.метод_упаковки_forget() |Например frm.place_forget()| чтобы скрыть кнопки.
4. Чтобы кнопки опять появились — заново размещаем методом, который использовали до скрытия.
5. На место исчезнувшей рамки можно свободно разместить новую с новым набором кнопок и потом их чередовать и чередовать и чередовать и чередовать…
Вариант второй:
Есть интересненькая особенность метода grid, которая называется grid_remove(). Специфика, по сравнению с первым вариантом заключается в том, что метод удаляет виджет из-под управления упаковщика, но при этом сохраняет информацию об упаковке.
Вариант третий (для извращенцев):
1. Создать словарь, где каждому ключу будет соответствовать список, состоящий из ссылок на объекты кнопок, размещений этих кнопок и с функциями, которые они вызывают.
2. Скрывать и показывать объекты массово, исходя из активности списков в отдельном цикле.
Если нужен пример — пишите…
P.S. Надеюсь, что Вы не выберете 3 вариант 🙂
Отредактировано 4kpt (Янв. 21, 2013 17:50:50)
#4 Янв. 22, 2013 08:41:52
plustilino Зарегистрирован: 2011-08-01 Сообщения: 9 Репутация: 0 Профиль Отправить e-mail
Tkinter, PyQt. Как скрыть виджет-элемент, а потом снова отобразить его?
С методом grid_remove() получилось примерно так:
from tkinter import * import datetime def func(): if var_what.get() == 0: l3.grid_remove() l3_in.grid_remove() l1.grid(row=4,column=0) e1_in.grid(row=5,column=0) elif var_what.get() == 1: today = datetime.date.today() l3_in.config(text=today) l1.grid_remove() e1_in.grid_remove() l3.grid(row=4,column=0) l3_in.grid(row=5,column=0) def func1(): pass win = Tk() var_what = IntVar() var_what.set(0) what_days1 = Radiobutton(text="One",variable=var_what,value=0,command=func) what_days2 = Radiobutton(text="Two",variable=var_what,value=1,command=func) l1 = Label(text='Дата1:') e1_in = Entry(width=10) l2 = Label(text='Дата2:') e2_in = Entry(width=10) l3 = Label(text='Сегодня:') l3_in = Label(width=10,bg="lightgray") l_out = Label(width=10,bg="lightgreen") but = Button(text="Вычислить",command=func1) what_days1.grid(row=0,column=0,columnspan=2) what_days2.grid(row=1,column=0,columnspan=2) Frame(bg='darkgray',width=200,height=5).grid(row=3,column=0,columnspan=2,pady=7) l1.grid(row=4,column=0) e1_in.grid(row=5,column=0) l2.grid(row=4,column=1) e2_in.grid(row=5,column=1) but.grid(row=6,column=0,pady=15) l_out.grid(row=6,column=1) win.mainloop()

Отредактировано plustilino (Фев. 8, 2013 08:19:58)
Виджеты в PyQt5

Виджеты – это основные строительные кирпичики приложения. PyQt5 имеет множество разнообразных виджетов, включая кнопки, чекбоксы, ползунки и списки. В этой части руководства, мы опишем несколько полезных виджетов: QCheckBox, ToggleButton, QSlider, QProgressBar и QCalendarWidget.
QCheckBox (чекбокс)
QCheckBox – чекбокс (виджет, который имеет два состояния: включен и выключен). Как правило, чекбоксы используют для функций приложения, которые могут быть включены или выключены.
В нашем примере, мы создаём чекбокс, который переключает заголовок окна.
Это конструктор QCheckBox.
Мы установили заголовок окна так, что мы должны к тому же проверять чекбокс. По умолчанию, заголовок окна не установлен и чекбокс выключен.
Мы связываем наш метод changeTitle(), с сигналом stateChanged. Метод changeTitle() будет переключать заголовок окна.
Если виджет помечен галочкой, мы устанавливаем заголовок окна. В противном случае, мы устанавливаем пустую строку в заголовке.
Кнопка переключателя (toogle button)
Кнопка переключателя – это QPushButton в особом режиме. Это кнопка, которая имеет два состояния: нажатое и не нажатое. Мы переключаемся между этими двумя состояниями, кликая по ней. Существуют ситуации, где эта функциональность отлично подходит.
" " В нашем примере, мы создаём три кнопки переключателя и QWidget. Мы устанавливаем чёрный цвет фона. Кнопки переключателей будут переключать красные, зелёные и синие части значений цвета. Цвет фона будет зависеть от того, на какие кнопки переключателей мы нажали.
Это начальное значение цвета (чёрный).
Чтобы создать кнопку переключателя, мы создаём QPushButton и делаем её проверяемой, путём вызова метода setCheckable().
Мы привязываем сигнал к нашему пользовательскому методу. Мы используем сигнал clicked, который работает с логическим значением.
Мы получаем кнопку, которая была переключена.
В случае кнопки red, мы обновляем красную часть цвета соответственно.
" Мы используем таблицы стилей, чтобы менять цвет фона.
QSlider (ползунок)
Qslider – ползунок (виджет, который имеет простой регулятор). Этот регулятор может быть утянут назад и вперёд. Таким способом, мы выбираем значение для конкретной задачи. Иногда, использование ползунка более естественно, чем ввод числа или использование переключателя-счётчика. В нашем примере, мы покажем один ползунок и одну метку. Метка будет показывать изображение. Ползунок будет контролировать метку.
В нашем примере, мы симулируем контроль громкости. Путём перетаскивания регулятора ползунка, мы меняем изображение на метке.
Здесь мы создаём горизонтальный ползунок.
Мы создаём виджет QLabel и устанавливаем начальное изображение "Mute" на него.
Мы привязываем сигнал valueChanged к определенному нами методу changeValue().
Основываясь на значении ползунка, мы устанавливаем изображение на метку. В коде выше, мы устанавливаем изображение mute.png на метку, если ползунок приравнен к нулю.
QProgressBar (прогресс бар)
QProgressBar – прогресс бар (виджет, который используется, когда мы обрабатываем продолжительные задачи). Он анимирует процесс, чтобы пользователи знали, что задача продвигается. Мы можем установить минимальное и максимальное значение для прогресс бара. Значения по умолчанию – 0 и 99.
В нашем примере, мы имеем горизонтальный индикатор прогресса и кнопку. Кнопка запускает и останавливает индикатор прогресса.
Это конструктор QProgressBar.
Чтобы активировать индикатор прогресса, мы используем объект таймера.
Чтобы запустить событие таймера, мы вызываем его методом start(). Этот метод имеет два параметра: таймаут, и объект, который будет принимать события.
Каждый QObject и его наследники имеют обработчик событий timerEvent(). Для того, чтобы реагировать на события таймера, мы переопределяем обработчик событий.
Внутри метода doAction(), мы запускаем и останавливаем таймер.
QCalendarWidget (виджет календаря)
QCalendarWidget предоставляет виджет помесячного календаря. Он позволяет пользователю выбирать дату простым и интуитивно-понятным способом.
Пример имеет виджет календаря и виджет метки. Текущая выбранная дата отображается в виджете метки.
Если мы выбираем дату из виджета, срабатывает сигнал clicked[QDate]. Мы присоединяем этот сигнал к пользовательскому методу showDate().
Мы возвращаем выбранную дату путём вызова метода selectedDate(). Тогда мы превращаем объект даты в строку и устанавливаем его в виджет метки.
В этой части руководства PyQt5, мы изучили некоторые виджеты.
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
PyQt 5: визуальные эффекты, включение виджетов, выход из программы
self.resize(350, 250)
self.label = QtGui.QLabel("
self.btn = QtGui.QPushButton("On\Off label")
self.btnProgress = QtGui.QPushButton("Progress")
self.btnVis = QtGui.QPushButton("Visible")
self.btnOpac = QtGui.QPushButton("Opacity")
self.btnColor = QtGui.QPushButton("Color")
self.btnClose = QtGui.QPushButton("Close")
self.box = QtGui.QVBoxLayout()
self.box.addWidget(self.label)
self.box.addWidget(self.btn)
self.box.addWidget(self.btnProgress)
self.box.addWidget(self.btnVis)
self.box.addWidget(self.btnOpac)
self.box.addWidget(self.btnColor)
self.box.addWidget(self.btnClose)
self.setLayout(self.box)
self.connect(self.btn, QtCore.SIGNAL("clicked()"), self.des)
self.connect(self.btnProgress, QtCore.SIGNAL("clicked()"), self.desProg)
self.connect(self.btnVis, QtCore.SIGNAL("clicked()"), self.desVis)
self.connect(self.btnOpac, QtCore.SIGNAL("clicked()"), self.opac)
self.connect(self.btnColor, QtCore.SIGNAL("clicked()"), self.color)
self.connect(self.btnClose, QtCore.SIGNAL("clicked()"), self, QtCore.SLOT("close()"))
#closeEvent()
ev = 0
def closeEvent(self, event):
if self.ev == 3:
event.accept()
elif self.ev < 3:
event.ignore()
self.ev += 1
#Color
def color(self):
pal = self.palette()
pal.setColor(QtGui.QPalette.Normal, QtGui.QPalette.Window, QtGui.QColor("DarkGreen"))
self.setPalette(pal)
self.label.setStyleSheet("background-color: #ffffff;")
#Opacity widget
ix = 0.0
def opac(self):
while self.ix time.sleep(1)
self.setWindowOpacity(self.ix)
self.ix += 0.25
#visible widget
def desVis(self):
if self.label.isVisible() == True:
self.label.setVisible(False)
elif self.label.isVisible() == False:
self.label.setVisible(True)
#ON\OFF widget
a = 1
def des(self):
if self.a == 1:
self.label.setDisabled(True)
self.a = 2
elif self.a == 2:
self.label.setDisabled(False)
self.a = 1
#inscription over the raster image (simulation progress)
def desProg(self):
splash = QtGui.QSplashScreen(QtGui.QPixmap("img.png"))
splash. showMessage ("Load data. 0%", Qt.AlignHCenter | Qt.AlignBottom, Qt.black)
splash.show()
for i in range(1, 6):
time.sleep(1)
splash.showMessage("Load data. %".format(i*20), Qt.AlignHCenter | Qt.AlignBottom, Qt.black)
QtGui.qApp.processEvents()
splash.show()
splash.finish(splash)
app = QtGui.QApplication(sys.argv)
prog = Prog()
prog.show()
sys.exit(app.exec_())
Видео выложу на своем канале в YouTube
Как в PyQt5 скрывать неиспользуемые виджеты?
пытаюсь реализовать калькулятор фигур, хочу сделать чтобы при выборе фигуры, отображались только нужные для нее параметры в калькуляторы. Пока не придумал ничего кроме отключать через enabled все элементы и подключать нужные при выборе фигуры (скрин прилагаю).
Но эта реализация далека от идеала. В идеале, сделать такие объекты невидимыми, и отсортировать в layote отсортировать в layote сверху вниз по видимости.

- Вопрос задан более года назад
- 167 просмотров
1 комментарий
Средний 1 комментарий

Скрыть не проблема - проблема не скрывать / показывать по отдельности а делать это по признаку для группы. У меня есть пару програм с более менее сложным интерфейсом где эту задачу я решал через контейнеры более высокого порядка, например табы
Ну а так на вкус и цвет. но с усложнением интерфейса и и увеличением параметров все может превратиться в кашу
