Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Не удаётся вызвать функцию при работе с дочерним окном. [RSS Feed]

#1 Июнь 18, 2012 20:38:48

modos189
Зарегистрирован: 2012-05-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не удаётся вызвать функцию при работе с дочерним окном.

Здравствуйте. Я из меню вызываю дочернее окно. В дочернем окне есть список и кнопка. По нажатию на эту кнопку должна вызываться функция, которая входит в состав дочернего окна (не знаю как это правильно назвать, в общем отступ такой же как у def setupUi)

def select_backup(self): должен вызваться из

        QtCore.QObject.connect(self.pushButton_2, QtCore.SIGNAL("clicked()"), self.select_backup)

но при нажатии на кнопку ничего не происходит.


Вот полный текст. Начиная с строки 110 при нажатии на кнопку вызывается функция control_backup которая открывает дочернее окно Ui_ControlBackup
В нём на 423-424 строках вызываю self.select_backup (которая на 441-442) но ни сообщения об ошибке не сообщения ‘ok’ в консоли нет. Что может быть не правильно? Я не могу понять

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import platform
import os
import ConfigParser
import urllib
import getpass
import shutil
from datetime import *
from PyQt4 import QtCore, QtGui
server = "http://modostroi.ru/mpm/"
urllib.urlretrieve(server+'menecraft_info_package.ini',
        filename='menecraft_info_package.ini')
# скачиваем список пакетов
pth = os.path.expanduser('~')+'/'
# путь до домашней папки
program_name = 'Minecraft Package Manager'
program_version = 'v0.6'
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(500, 476)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tabWidget = QtGui.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(0, 0, 501, 431))
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtGui.QWidget()
        self.tab.setObjectName("tab")
        self.listWidget = QtGui.QListWidget(self.tab)
        self.listWidget.setGeometry(QtCore.QRect(10, 10, 171, 381))
        self.listWidget.setToolTip("")
        self.listWidget.setAutoFillBackground(True)
        self.listWidget.setObjectName("listWidget")
        
        menecraft_list_package = ConfigParser.ConfigParser()
        menecraft_list_package.read('menecraft_info_package.ini')
        f = menecraft_list_package.sections()
        for line in f:
            QtGui.QListWidgetItem(self.listWidget)
        
        QtCore.QObject.connect(self.listWidget,
            QtCore.SIGNAL("clicked(QModelIndex)"),
            self.desc)
        self.pushButton_1 = QtGui.QPushButton(self.tab)
        self.pushButton_1.setGeometry(QtCore.QRect(190, 350, 201, 41))
        self.pushButton_1.setObjectName("pushButton_1")
        QtCore.QObject.connect(self.pushButton_1,
            QtCore.SIGNAL("clicked()"),
            self.select_minecraft_version)
        self.pushButton_2 = QtGui.QPushButton(self.tab)
        self.pushButton_2.setGeometry(QtCore.QRect(400, 350, 91, 41))
        self.pushButton_2.setObjectName("pushButton_2")
        self.textBrowser = QtGui.QTextBrowser(self.tab)
        self.textBrowser.setGeometry(QtCore.QRect(190, 11, 301, 331))
        self.textBrowser.setObjectName("textBrowser")
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtGui.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.tabWidget.addTab(self.tab_2, "")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 500, 19))
        self.menubar.setObjectName("menubar")
        self.menu_2 = QtGui.QMenu(self.menubar)
        self.menu_2.setObjectName("menu675")
        self.menu_1 = QtGui.QMenu(self.menubar)
        self.menu_1.setObjectName("menu")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        self.statusminecraft()
        MainWindow.setStatusBar(self.statusbar)
        self.action_1 = QtGui.QAction(MainWindow)
        self.action_1.setObjectName("action_1")
        self.action_2 = QtGui.QAction(MainWindow)
        self.action_2.setObjectName("action_2")
        self.action_3 = QtGui.QAction(MainWindow)
        self.action_3.setObjectName("action_3")
        self.action_4 = QtGui.QAction(MainWindow)
        self.action_4.setObjectName("action_4")
        self.menu_1.addAction(self.action_1)
        self.menu_1.addAction(self.action_2)
        self.menu_2.addAction(self.action_3)
        self.menu_2.addAction(self.action_4)
        self.menubar.addAction(self.menu_1.menuAction())
        self.menubar.addAction(self.menu_2.menuAction())
        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QObject.connect(self.action_1,
            QtCore.SIGNAL("activated()"), self.create_backup)
        QtCore.QObject.connect(self.action_2,
            QtCore.SIGNAL("activated()"), self.control_backup)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
    def statusminecraft(self):
        if os.path.exists('config.ini'):
            config = ConfigParser.ConfigParser()
            config.read('config.ini')
            if (config.has_option('minecraft', 'version')==True):
                minecraft_version = config.get('minecraft', 'version')
                text = u'Сейчас установлен minecraft v'
                self.statusbar.showMessage(text+minecraft_version)
        else:
            create_congig_txt = open('config.ini', 'w')
            create_congig_txt.close()
            if os.path.exists(pth+'.minecraft/bin'):
                text = u'Необходимо удалить Minecraft, похоже он'
                ' установлен не из '
                self.statusbar.showMessage(text+program_name)
    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(
            QtGui.QApplication.translate("MainWindow",
            "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        __sortingEnabled = self.listWidget.isSortingEnabled()
        self.listWidget.setSortingEnabled(False)
        
        menecraft_list_package = ConfigParser.ConfigParser()
        menecraft_list_package.read('menecraft_info_package.ini')
        f = menecraft_list_package.sections()
        i=0
        for line in f:
            self.listWidget.item(i).setText(
                QtGui.QApplication.translate("MainWindow", line,
                None, QtGui.QApplication.UnicodeUTF8))
            i+=1
        self.listWidget.setSortingEnabled(__sortingEnabled)
        self.pushButton_1.setText(QtGui.QApplication.translate(
            "MainWindow", "Установить", None,
            QtGui.QApplication.UnicodeUTF8))
        self.pushButton_2.setText(QtGui.QApplication.translate(
            "MainWindow", "Подробнее", None,
            QtGui.QApplication.UnicodeUTF8))
        self.textBrowser.setHtml(QtGui.QApplication.translate(
            "MainWindow", "слева выберите версию для установки",
            None, QtGui.QApplication.UnicodeUTF8))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab),
            QtGui.QApplication.translate("MainWindow",
            "Minecraft", None, QtGui.QApplication.UnicodeUTF8))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2),
            QtGui.QApplication.translate("MainWindow",
            "Модификации", None, QtGui.QApplication.UnicodeUTF8))
        self.menu_1.setTitle(QtGui.QApplication.translate(
            "MainWindow", "Резервные копии",
            None, QtGui.QApplication.UnicodeUTF8))
        self.menu_2.setTitle(QtGui.QApplication.translate(
            "MainWindow", "Справка",
            None, QtGui.QApplication.UnicodeUTF8))
        self.action_1.setText(QtGui.QApplication.translate(
            "MainWindow", "Создать резервную копию",
            None, QtGui.QApplication.UnicodeUTF8))
        self.action_2.setText(QtGui.QApplication.translate(
            "MainWindow", "Восстановить резернвую копию",
            None, QtGui.QApplication.UnicodeUTF8))
        self.action_3.setText(QtGui.QApplication.translate(
            "MainWindow", "О программе",
            None, QtGui.QApplication.UnicodeUTF8))
        self.action_4.setText(QtGui.QApplication.translate(
            "MainWindow", "Как пользоваться",
            None, QtGui.QApplication.UnicodeUTF8))
    def select_minecraft_version(self):
        for item in self.listWidget.selectedItems():
            select_version = item.text()
        select_version = str(select_version)
        
        MinecraftDownloadWindow = QtGui.QMainWindow()
        ui = Ui_MinecraftDownloadWindow(select_version)
        self.second_window = MinecraftDownloadWindow
        ui.setupUi(MinecraftDownloadWindow)
        MinecraftDownloadWindow.show()
        ui.d(select_version)
    def desc(self, QModelIndex):
        for item in self.listWidget.selectedItems():
            select_version = item.text()
        menecraft_info_package = ConfigParser.ConfigParser()
        menecraft_info_package.read('menecraft_info_package.ini')
        desc = menecraft_info_package.get(str(select_version), 'desc')
        
        self.textBrowser.setHtml(QtGui.QApplication.translate(
                "MainWindow", "<!DOCTYPE html>\n<html><body style=\" font-family:\'Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"+desc+"</body></html>", None, QtGui.QApplication.UnicodeUTF8))
    def create_backup(self):
        CreateBackup = QtGui.QMainWindow()
        ui = Ui_CreateBackup()
        self.second_window = CreateBackup
        ui.setupUi(CreateBackup)
        CreateBackup.show()
    def control_backup(self):
        ControlBackup = QtGui.QMainWindow()
        ui = Ui_ControlBackup()
        ui.setupUi(ControlBackup)
        ControlBackup.show()
        self.second_window = ControlBackup
class Ui_MinecraftDownloadWindow(object):
    def __init__(self, select_version):
        self.select_version = select_version
    def setupUi(self, MinecraftDownloadWindow):
        MinecraftDownloadWindow.setObjectName("MinecraftDownloadWindow")
        MinecraftDownloadWindow.resize(272, 179)
        self.centralwidget = QtGui.QWidget(MinecraftDownloadWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.progressBar = QtGui.QProgressBar(self.centralwidget)
        self.progressBar.setGeometry(QtCore.QRect(10, 140, 171, 31))
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.textBrowser = QtGui.QTextBrowser(self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect(10, 10, 251, 121))
        self.textBrowser.setObjectName("textBrowser")
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(190, 140, 71, 31))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.setEnabled(False)
        QtCore.QObject.connect(self.pushButton,
            QtCore.SIGNAL("clicked()"), MinecraftDownloadWindow,
            QtCore.SLOT("close()"))
        QtCore.QObject.connect(self.pushButton,
            QtCore.SIGNAL("clicked()"), MinecraftDownloadWindow.close)
        MinecraftDownloadWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MinecraftDownloadWindow)
        QtCore.QMetaObject.connectSlotsByName(MinecraftDownloadWindow)
    def retranslateUi(self, MinecraftDownloadWindow):
        MinecraftDownloadWindow.setWindowTitle(
            QtGui.QApplication.translate("MinecraftDownloadWindow",
            "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate(
            "MinecraftDownloadWindow", "закрыть",
            None, QtGui.QApplication.UnicodeUTF8))
    def loadProgress(self, bl, blsize, size):
        p = float(min(bl*blsize, size)) / size * 85 + 5
        self.progressBar.setProperty("value", p)
    def d(self, select_version):
        menecraft_info_package = ConfigParser.ConfigParser()
        menecraft_info_package.read('menecraft_info_package.ini')
        url = menecraft_info_package.get(self.select_version, 'url')
        filename = menecraft_info_package.get(self.select_version,
            'filename')
        
        self.textBrowser.setHtml(QtGui.QApplication.translate(
            "MinecraftDownloadWindow", "предустановочная подготовка",
            None, QtGui.QApplication.UnicodeUTF8))
        mkdir('mpm_cache')
        self.progressBar.setProperty("value", 1)
        mkdir('mpm_cache/minecraft')
        self.progressBar.setProperty("value", 3)
        mkdir('mpm_cache/minecraft/temp')
        self.progressBar.setProperty("value", 5)
        self.textBrowser.setHtml(QtGui.QApplication.translate(
            "MinecraftDownloadWindow", "скачиваем клиент...",
            None, QtGui.QApplication.UnicodeUTF8))
        
        urllib.urlretrieve(url, 'mpm_cache/minecraft/'+filename,
            self.loadProgress)
        # качаем майнкрафт
        menecraft_info_package = ConfigParser.ConfigParser()
        menecraft_info_package.read('menecraft_info_package.ini')
        
        url = menecraft_info_package.get(select_version, 'url')
        filename = menecraft_info_package.get(select_version,
            'filename')
        
        self.textBrowser.setHtml(QtGui.QApplication.translate(
            "MinecraftDownloadWindow", "распаковка", None,
            QtGui.QApplication.UnicodeUTF8))
        self.progressBar.setProperty("value", 91)
        shutil.copy('mpm_cache/minecraft/'+filename,
            'mpm_cache/minecraft/temp/'+filename)
        qazwsx = filename.split('.')
        if (qazwsx[1]=='zip'):
            os.system('cd mpm_cache/minecraft/temp/ && unzip '+filename)
        elif (qazwsx[1]=='7z'):
            if (os.name=='posix'):
                os.system('cd mpm_cache/minecraft/temp/ && 7z x '+filename)
            elif (os.name=='nt'):
                shutil.copy('bin/7za.exe', 'mpm_cache/minecraft/temp/7za.exe')
                os.system('cd mpm_cache/minecraft/temp/ && 7za.exe x '+filename)
            else:
                print 'unknown platform'
        mkdir(pth+'.minecraft')
        self.progressBar.setProperty("value", 95)
        backup()
        remove(pth+'.minecraft/bin')
        self.progressBar.setProperty("value", 98)
        shutil.move('mpm_cache/minecraft/temp/.minecraft/bin',
            pth+'.minecraft/bin')
        
        remove('mpm_cache/minecraft/temp/')
        self.progressBar.setProperty("value", 100)
        self.textBrowser.setHtml(QtGui.QApplication.translate(
            "MinecraftDownloadWindow", "установка выполнена",
            None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setEnabled(True)
class Ui_CreateBackup(object):
    def setupUi(self, CreateBackup):
        CreateBackup.setObjectName("CreateBackup")
        CreateBackup.resize(291, 80)
        self.centralwidget = QtGui.QWidget(CreateBackup)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtGui.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 10, 271, 31))
        self.label.setScaledContents(False)
        self.label.setObjectName("label")
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(190, 40, 91, 31))
        self.pushButton.setObjectName("pushButton")
        backup()
        
        CreateBackup.setCentralWidget(self.centralwidget)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), CreateBackup, QtCore.SLOT("close()"))
        self.retranslateUi(CreateBackup)
        QtCore.QMetaObject.connectSlotsByName(CreateBackup)
    def retranslateUi(self, CreateBackup):
        CreateBackup.setWindowTitle(QtGui.QApplication.translate("CreateBackup", "CreateBackup", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("CreateBackup", "бекаб успешно создан", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("CreateBackup", "Закрыть", None, QtGui.QApplication.UnicodeUTF8))
class Ui_ControlBackup(object):
    def setupUi(self, ControlBackup):
        ControlBackup.setObjectName("ControlBackup")
        ControlBackup.resize(400, 250)
        self.centralwidget = QtGui.QWidget(ControlBackup)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(270, 210, 121, 31))
        self.pushButton.setObjectName("pushButton")
        self.listWidget = QtGui.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(10, 10, 381, 192))
        self.listWidget.setObjectName("listWidget")
        
        dir_backups = os.listdir(pth+'.minecraft/backup/')
        for line in dir_backups:
            QtGui.QListWidgetItem(self.listWidget)
        self.pushButton_2 = QtGui.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(10, 210, 121, 31))
        self.pushButton_2.setObjectName("pushButton_2")
        QtCore.QObject.connect(self.pushButton_2,
            QtCore.SIGNAL("clicked()"), self.select_backup)
        self.pushButton_3 = QtGui.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(140, 210, 121, 31))
        self.pushButton_3.setObjectName("pushButton_3")
        ControlBackup.setCentralWidget(self.centralwidget)
        QtCore.QObject.connect(self.pushButton,
            QtCore.SIGNAL("clicked()"), ControlBackup,
            QtCore.SLOT("close()"))
        self.retranslateUi(ControlBackup)
        QtCore.QMetaObject.connectSlotsByName(ControlBackup)
    def select_backup(self):
        print 'ok'
    def retranslateUi(self, ControlBackup):
        ControlBackup.setWindowTitle(QtGui.QApplication.translate(
            "ControlBackup", "ControlBackup",
            None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate(
            "ControlBackup", "Закрыть",
            None, QtGui.QApplication.UnicodeUTF8))
        __sortingEnabled = self.listWidget.isSortingEnabled()
        self.listWidget.setSortingEnabled(False)
        dir_backups = os.listdir(pth+'.minecraft/backup/')
        i=0
        for line in dir_backups:
            self.listWidget.item(i).setText(
                QtGui.QApplication.translate("ControlBackup", line,
                None, QtGui.QApplication.UnicodeUTF8))
            i+=1
        self.listWidget.setSortingEnabled(__sortingEnabled)
        self.pushButton_2.setText(QtGui.QApplication.translate(
            "ControlBackup", "Восстановить",
            None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton_3.setText(QtGui.QApplication.translate(
            "ControlBackup", "Удалить",
            None, QtGui.QApplication.UnicodeUTF8))
def remove(patch):
    if os.path.exists(patch)==True:
        if (os.name=='posix'):
            os.system('rm -R '+patch)
        elif (os.name=='nt'):
            os.system('del -R '+patch)
        else:
            print 'unknown platform'
def mkdir(patch):
    if os.path.exists(patch)==False:
        os.mkdir(patch)
def backup():
    if os.path.exists(pth+'.minecraft/bin'):
        mkdir(pth+'.minecraft/backup')
        backup_name = str(datetime.now())
        shutil.copytree(pth+'.minecraft/bin', pth+'.minecraft/backup/'+backup_name+'/bin')
        shutil.copytree(pth+'.minecraft/mods', pth+'.minecraft/backup/'+backup_name+'/mods')
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

p.s. извините за плохой код

Офлайн

#2 Июнь 18, 2012 22:19:27

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Не удаётся вызвать функцию при работе с дочерним окном.

Пока тут мешанина из генерированного Qt Designer'ом кода и логики (обсуждалось уже) проблемы будут только появляться.

Бегло посмотрел, другие слоты работают? Может декоратора @pyqtSlot у select_backup не хватает (маловероятно). Еще можно попробовать:

self.pushButton_2.clicked.connect(self.select_backup)
Хотя бы ошибку сразу напишет если что-то не так.

Офлайн

#3 Июнь 19, 2012 09:23:16

modos189
Зарегистрирован: 2012-05-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не удаётся вызвать функцию при работе с дочерним окном.

reclosedev
Пока тут мешанина из генерированного Qt Designer'ом кода и логики (обсуждалось уже) проблемы будут только появляться.
а почему появляются? Программе вроде бы без разницы взять код с этого же файла или импортировать. Или не так?

reclosedev
Еще можно попробовать:
Тоже безрезультатно.

Но если после
if __name__ == “__main__”:

заменить
ui = Ui_MainWindow()
на
ui = Ui_ControlBackup()

то кнопка работает в любом случае. Может надо как-то по другому окно открывать?

Офлайн

#4 Июнь 19, 2012 10:36:22

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Не удаётся вызвать функцию при работе с дочерним окном.

modos189
а почему появляются? Программе вроде бы без разницы взять код с этого же файла или импортировать. Или не так?
В прошлой теме уже обсуждалось http://python.su/forum/topic/14667/ и как правильно сделать там тоже есть.

Может быть причина в том, что для всех окон используется QMainWindow, хотя достаточно было бы QDialog или QWidget. Или ui, которые создаются таким странным образом, удаляются при выходе из функции.

Но это все догадки, чтобы найти проблему, сначала нужно сделать все правильно, с наследованием от виджета и ui, возможно и проблема исчезнет.

Офлайн

#5 Июнь 19, 2012 10:44:13

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Не удаётся вызвать функцию при работе с дочерним окном.

При выходе из функции control_backup

def control_backup(self):
        ControlBackup = QtGui.QMainWindow()
        ui = Ui_ControlBackup()
        ui.setupUi(ControlBackup)
        ControlBackup.show()
        self.second_window = ControlBackup
удаляется объект ui и его метод select_backup далее не вызываются.



Офлайн

#6 Июнь 19, 2012 11:19:00

modos189
Зарегистрирован: 2012-05-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не удаётся вызвать функцию при работе с дочерним окном.

agalen, а как исправить?

сейчас пытаюсь вывести ui в отдельные файлы, но ещё многое не работает

Офлайн

#7 Июнь 19, 2012 11:42:50

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Не удаётся вызвать функцию при работе с дочерним окном.


def control_backup(self):
ControlBackup = QtGui.QMainWindow()
ui = Ui_ControlBackup()
ui.setupUi(ControlBackup)
ControlBackup.show()
self.second_window = ControlBackup
self.second_ui = ui



Офлайн

#8 Июнь 19, 2012 11:49:45

modos189
Зарегистрирован: 2012-05-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не удаётся вызвать функцию при работе с дочерним окном.

спасибо

Офлайн

#9 Июнь 20, 2012 20:43:21

modos189
Зарегистрирован: 2012-05-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не удаётся вызвать функцию при работе с дочерним окном.

Пытаюсь переместить ui в файлы. Главное окно успешно сделал, а из него открыть другое не удаётся.

А именно

self.action_2.activated.connect(self.control_backup)

вызывает

def control_backup(self, QModelIndex):
self.second_window = ControlBackup()
second_window.show()

и появляется ошибка

TypeError: control_backup() takes exactly 2 arguments (1 given)

как мне передать ещё один аргумент?

интересно что

self.listWidget.clicked.connect(self.desc)

вызывает

def desc(self, QModelIndex):


без ошибок.

вот здесь код https://github.com/modos189/Minecraft-Package-Manager/tree/test_ui

Отредактировано modos189 (Июнь 20, 2012 20:44:14)

Офлайн

#10 Июнь 20, 2012 21:23:23

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Не удаётся вызвать функцию при работе с дочерним окном.

self.action_2.activated.connect(self.control_backup)
def control_backup(self, QModelIndex):

Дело в том, что это сигнал вызывает функцию без аргументов.

интересно что self.listWidget.clicked.connect(self.desc) вызывает def desc(self, QModelIndex): без ошибок

Потому-что (http://qt-project.org/doc/qt-4.8/qabstractitemview.html#clicked) передает индекс модели при вызове.

как мне передать ещё один аргумент?

Он же не используется? Если нужен, то откуда он берется? Если известен при соединении сигналов, то можно или с помощью lambda или c functools.partial:

import functools
...
self.action_2.activated.connect(functools.partial(self.control_backup, some_argument))
# or
self.action_2.activated.connect(lambda : self.control_backup(some_argument))
...
def control_backup(self, some_argument):

Если же не известен во время соединения сигналов, нужно это функции определять (допустим выбранные айтемы в листвиджите):

def control_backup(self):
    items = self.listWidget.selectedItems()
    createSomethingWith(items)  # or whatever

Отредактировано reclosedev (Июнь 20, 2012 21:34:40)

Офлайн

  • Начало
  • » GUI
  • » Не удаётся вызвать функцию при работе с дочерним окном.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version