Форум сайта python.su
Здравствуйте, форумчане. Хочу обратиться к вам с таким вопросом.
Занялся я написанием некоторой программы на PyQT, суть ее - имею главный виджет, висящий вверху экрана на нем кнопки.
http://radikal.ru/F/s46.radikal.ru/i112 … 2.jpg.html
По нажатию любой кнопки открывается ее новый виджет выводится на экран по центру экрана.
В принципе я уже немного разобрался , но не получается из главного виджета вызвать второй.
Все виджеты создаю через QT дизайнер и через uic привязываю к проекту. В общем как то так.
Пока при запуске программы показывается главный виджет и центрируется вверху экрана, дальше не осилил.
В общем подскажите как из одного виджета по нажатию кнопки вызвать другой, как их сконнектить (про connect знаю)?
Если возможно с примером. Заранее благодарен вам за помощь.
Офлайн
from PyQt4 import Qt as qt
import sys
app = qt.QApplication(sys.argv)
mw = qt.QMainWindow()
fr = qt.QFrame()
fr.lt = qt.QVBoxLayout()
fr.btn = qt.QPushButton("Gimme a new window")
fr.setLayout(fr.lt)
fr.lt.addWidget(fr.btn)
mw.setCentralWidget(fr)
fr2 = qt.QFrame()
fr2.setWindowTitle("I am a new window")
def click(checked):
fr2.show()
fr.btn.clicked.connect(click)
mw.show()
app.exec_()
Офлайн
Да этот вариант работает. А может вы могли бы помочь мне мой код исправить?
Содержимое файла TeacherApp.pyw:
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui # подключает основные модули PyQt
import mainform # подключает модуль описания формы
import runcommand # подключает модуль описания формы
import view # подключает модуль описания формы
def main():
app = QtGui.QApplication(sys.argv) # создаёт основной объект программы
form = mainform.MainForm() # создаёт объект главной формы
runform = runcommand.RunForm() # создаёт объект главной формы
viewform = view.ViewForm() # создаёт объект главной формы
screen = QtGui.QDesktopWidget().screenGeometry()
sizeform = form.geometry()
sizerunform = runform.geometry()
sizeviewform = viewform.geometry()
form.setGeometry(QtCore.QRect((screen.width()-sizeform.width())/2, 1, sizeform.width(), sizeform.height())) # по центру сверху
runform.setGeometry(QtCore.QRect((screen.width()-sizerunform.width())/2, sizeform.height(), sizerunform.width(), sizerunform.height()))
viewform.setGeometry(QtCore.QRect(screen.width()-screen.width(), sizeform.height(), screen.width(), screen.height()))
form.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint)
runform.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint)
viewform.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint)
form.show() # даёт команду на отображение объекта формы и содержимого
app.exec() # запускает приложение
if __name__ == "__main__":
sys.exit(main())
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui, uic # подключает основные модули PyQt
# прототип главной формы
class MainForm(QtGui.QWidget):
# конструктор
def __init__(self):
super(MainForm, self).__init__()
# динамически загружает визуальное представление формы
uic.loadUi("mainform.ui", self)
self.connect(self.pushButton_12, QtCore.SIGNAL("clicked()"),
self.exitapp)
def exitapp(self):
QtGui.QApplication.exit()
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui, uic # подключает основные модули PyQt
# прототип главной формы
class RunForm(QtGui.QWidget):
# конструктор
def __init__(self):
super(RunForm, self).__init__()
# динамически загружает визуальное представление формы
uic.loadUi("runcommand.ui", self)
#self.connect(self.pushButton_10, QtCore.SIGNAL("clicked()"),
#self.showruncommand)
#def showruncommand(self):
#runform.show()
Офлайн
lich100Если кнопка pushButton_10 у Вас в модуле mainform, то и обработчик ее нажатия надо описывать там же. Как-то так:
Вот я не понимаю как в файле runcommand.py прописать чтобы при нажатии кнопки pushButton_10 на mainform открылась форма runcommand? Помогите исправить если не сложно. Может еще где ошибка?
class MainForm(QtGui.QWidget):
# конструктор
def __init__(self):
super(MainForm, self).__init__()
# динамически загружает визуальное представление формы
uic.loadUi("mainform.ui", self)
self.connect(self.pushButton_12, QtCore.SIGNAL("clicked()"),
self.exitapp)
self.pushButton_10.clicked.connect(self.pushButton_10_click)
def pushButton_10_click(self, checked):
import runcommand
self.form = runcommand.RunForm()
self.from.show()
Офлайн
В общем я переделал как вы сказали, окно при нажатии запускается и сразу закрывается, мелькает в общем, в чем может быть проблема?
Переделал mainform.py вот таким образом:
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui, uic # подключает основные модули PyQt
import mainform # подключает модуль описания формы
import runcommand # подключает модуль описания формы
import view # подключает модуль описания формы
# прототип главной формы
class MainForm(QtGui.QWidget):
# конструктор
def __init__(self):
super(MainForm, self).__init__()
# динамически загружает визуальное представление формы
uic.loadUi("mainform.ui", self)
self.connect(self.pushButton_12, QtCore.SIGNAL("clicked()"),
self.exitapp)
self.connect(self.pushButton_10, QtCore.SIGNAL("clicked()"),
self.showruncommand)
def showruncommand(self):
runform = runcommand.RunForm()
runform.show()
def exitapp(self):
QtGui.QApplication.exit()
Отредактировано (Март 28, 2011 20:04:38)
Офлайн
Офлайн
apologize828Спасибо конечно, но я ничего не понял( Можете на основе моего кода подсказать?
вам сюда
Отредактировано (Март 29, 2011 11:14:37)
Офлайн
lich100прочтите пост №11 в той ссылке что я вам дал, и поймете почему окно появляется и сразу исчезает и то как это исправитьapologize828Спасибо конечно, но я ничего не понял( Можете на основе моего кода подсказать?
вам сюда
Офлайн
apologize828Теперь понял, работает. Из-за этих self'ов я второй день уже сижу.lich100прочтите пост №11 в той ссылке что я вам дал, и поймете почему окно появляется и сразу исчезает и то как это исправитьapologize828Спасибо конечно, но я ничего не понял( Можете на основе моего кода подсказать?
вам сюда
Офлайн
Да и по поводу коннекта, погляди на самый первый пост после твоего, коннект лучше делать так как там показали.
Офлайн