Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 26, 2017 12:16:44

Ainur
Зарегистрирован: 2017-10-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

PYQT оконное приложение на python

Добрый день. Пишу приложение, которое при нажатии на кнопку выводит во втором окне запрос базы. Все работает. Вот только кнопка получается одноразовая, при повторном нажатии уже ничего не работает. Есть еще вторая кнопка которая выдает третье окно уже с результатом другого запроса, тоже работает, но как открылось второе или третье окно первое деактивируется. Как сделать чтобы оно оставалось активным и кнопки постоянно работали? Помогите пожалуйста

 # -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
from PyQt4.QtSql import *
#boremsia s kirillitsoi
reload(sys)
sys.setdefaultencoding('utf-8')
import locale
sys.setdefaultencoding(locale.getpreferredencoding())
import pypyodbc  
import xlrd
#importiruiem zagotovlennie formy
from slogi import *
from import_table import *
from check import *
class MyWin(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyWin, self).__init__()
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_TVMA()
        self.ui.setupUi(self)
        # sobitia pri najatii na knopki
        self.ui.pushButton.clicked.connect(self.MyFunction)
        self.ui.btn_load.clicked.connect(self.loadData)
        self.ui.btn_check.clicked.connect(self.checkData)
    def MyFunction(self):
        self.ui.textEdit_2.setText("")
        try:
            s=self.ui.textEdit.toPlainText() # vvod puti na fail s ekrana
            rb = xlrd.open_workbook(s,formatting_info=True)
            sheet = rb.sheet_by_index(0)
            connection = pypyodbc.connect('Driver={SQL Server};Server=***;Database=***;uid=***;pwd=***')
            cursor = connection.cursor()
            for rownum in range(1,sheet.nrows): #propuskaem wapku v eksele, 1 stroka
                if sheet.row_values(rownum)[0]=='': #propuskaem pustye stroki
                    pass
                else:
                    #perebiraem kajdyi element spiska
                    vals=[sheet.row_values(rownum)]
                    vals1=vals[0][0]
                    a=vals[0][1]
                    b=vals[0][2]
                    c=vals[0][3]
                    d=vals[0][4]
                    e=vals[0][5]
                    f=vals[0][6]
                    g=vals[0][7]
                    h=vals[0][8]
                    i=vals[0][9]
                    j=vals[0][10]
                    k=vals[0][11]
                    l=vals[0][12]
                    cursor.execute ('insert into dbo.TVMA_IMPORT (Date,PTime,PName,BNo,BTime,BB,BType,SPos,SName,SDur,Snote,SID,VID) values (?,?,?,?,?,?,?,?,?,?,?,?,?)',(vals1,a,b,c,d,e,f,g,h,i,j,k,l)) #vstavliaem v bazu kajdyi element po opredelennomu poliu
       
                    connection.commit()
                            
            self.ui.textEdit_2.setText('Successful')
        except Exception:
            self.ui.textEdit_2.setText('Error. Please, try again')
    def loadData(self):
        connection = pypyodbc.connect('Driver={SQL Server};Server=*;Database=*;uid=*;pwd=*')
        cursor = connection.cursor()
        code=self.ui.textEdit_3.toPlainText() #vvod daty proverki s ekrana
        db_cmd = ("select * from dbo.TVMA_IMPORT where date='%s'" % code)
        result = cursor.execute(db_cmd)
        self.window = QtGui.QMainWindow() #otkrivaem novoe okno
        self.ui = Ui_Other_Window()
        self.ui.setupUi(self.window)
        myapp.hide()
        self.window.show()
        self.ui.table_import.setRowCount(0)
        for row_number, row_data in enumerate(result):
            self.ui.table_import.insertRow(row_number)
            for column_number, data in enumerate(row_data):
                self.ui.table_import.setItem(row_number, column_number, QtGui.QTableWidgetItem(str(data).decode('cp1251'))) #dlia korrektnogo otobrajenia russkih bukv
                
        connection.close()
    def checkData(self):
        connection = pypyodbc.connect('Driver={SQL Server};Server=*;Database=*;uid=*;pwd=*')
        cursor = connection.cursor()
        code=self.ui.textEdit_4.toPlainText() #vvod daty proverki s ekrana
        db =  ("""
                SET NOCOUNT ON;  --obhodim problemu s temptable
                update dbo.TVMA_IMPORT set Sname = REPLACE(Sname,'/','')	from dbo.TVMA_IMPORT
                GO
                if OBJECT_ID('tempdb..##tmp') is null
	                create table ##tmp (v1 datetime, v2 datetime, pt_id int, th_id int, stmom int, type int, xx_id int, lg_id int, dur int, note varchar(100))
                else truncate table ##tmp
                declare @day int,
            		       @save char(1)
                set @day = datediff(day,'19900101','%s')
                set @save = 'N'; insert ##tmp exec dbo.spkz_tvma_prot_generation  @day, @save;""" %code)
        dbc=("SELECT TOP (1000) [Date],[PTime],[PName],[BNo],[BTime],[BB],[BType],[SPos],[SName],[SDur] from test")
        cursor.execute(db)
        cursor.execute("select * from ##tmp where xx_id = -1;")
        res=cursor.fetchall()
        #result1 = connection.execute(db)
        self.window = QtGui.QMainWindow()
        self.ui = Ui_CheckWindow()
        self.ui.setupUi(self.window)
        self.window.show()
        myapp.hide()
        self.ui.table_check.setRowCount(0)
        for row_number, row_data in enumerate(res):
            self.ui.table_check.insertRow(row_number)
            for column_number, data in enumerate(row_data):
                self.ui.table_check.setItem(row_number, column_number, QtGui.QTableWidgetItem(str(data).decode('cp1251')))
        connection.commit()
sys.stderr = open("errors.txt", "w+")
if __name__=="__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyWin()
    myapp.show()
    sys.exit(app.exec_())
input()

Офлайн

#2 Окт. 26, 2017 17:52:25

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PYQT оконное приложение на python

Ainur
Вот только кнопка получается одноразовая, при повторном нажатии уже ничего не работает.
опишите поподробнее:
что это за кнопка , и что получается при повторном нажатии? с вашего обьяснения ничего непонятно, а догадаться както трудно не имея возможности запустить у себя ваш код.
Ainur
но как открылось второе или третье окно первое деактивируется
деактивируется в смысле закрывается, тоесть исчезает, или просто с него фокус уходит?И опять же какое из окон у вас “первое”, “второе” и “третье”. мы опять должны угадывать?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Окт. 27, 2017 07:47:09

Ainur
Зарегистрирован: 2017-10-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

PYQT оконное приложение на python

PEHDOM
опишите поподробнее:
что это за кнопка , и что получается при повторном нажатии? с вашего обьяснения ничего непонятно, а догадаться както трудно не имея возможности запустить у себя ваш код.
Все по порядку. Открывается главное окно. в textEdit_3 ввожу дату (переменная в запросе в базу). При нажатии на кнопку btn_load запускается функция loadData и открывается новое окно с отображением результата запроса
 self.window = QtGui.QMainWindow()
        self.ui = Ui_CheckWindow()
        self.ui.setupUi(self.window)
        self.window.show()
        myapp.hide()
Эта часть функции именно отвечает за открытие нового окна. И главное окно закрывается, если убрать myapp.hide главное окно останется открытым, но уже при повторном нажатии кнопики ничего не срабатывает. Со второй функцией checkData и кнопкой btn_check по анологии. Такое чувство что как открылось новое окно программа остается в новом окне и уже не видит главное окно
PEHDOM
деактивируется в смысле закрывается, тоесть исчезает, или просто с него фокус уходит?И опять же какое из окон у вас “первое”, “второе” и “третье”. мы опять должны угадывать?
уходит фокус, надо чтобы можно было работать с главным окном дальше. Первое это главное окно, а второе и третье это дополнительные окна, которые открываются по нажатию на кнопки в главном окне. Но после нажатия на одну из этих кнопок главное уже не реагирует ни на какие другие действия

Офлайн

#4 Окт. 27, 2017 10:21:03

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PYQT оконное приложение на python

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

 class MyWin(QtGui.QMainWindow):
    def __init__(self, parent=None):
        .........
        self.ui = Ui_TVMA()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(self.MyFunction)
        self.ui.btn_load.clicked.connect(self.loadData)
        self.ui.btn_check.clicked.connect(self.checkData)
    def MyFunction(self):
        self.ui.textEdit_2.setText("")
        .......
            s=self.ui.textEdit.toPlainText() 
        ........
            self.ui.textEdit_2.setText('Successful')
        ........
            self.ui.textEdit_2.setText('Error. Please, try again')
    def loadData(self):
        .........
        code=self.ui.textEdit_3.toPlainText() 
        .........
        self.window = QtGui.QMainWindow() 
        self.ui = Ui_Other_Window()
        self.ui.setupUi(self.window)
        .........
        connection.close()
    def checkData(self):
        .........
        self.window = QtGui.QMainWindow()
        self.ui = Ui_CheckWindow()
        self.ui.setupUi(self.window)
        .........
в главном окне у вас self.ui = Ui_TVMA() а потом вы делаете self.ui = Ui_Other_Window() или self.ui = Ui_CheckWindow() в loadData/checkData. Как вы думаете после вызова процедур loadData/checkData что происходит когда вы делаете например s=self.ui.textEdit.toPlainText() или когда нажимаете кнопку? ведь self.ui уже абсолютно другой обьект, и в нем банально нету атрибута textEdit или btn_load.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#5 Окт. 27, 2017 11:11:52

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

PYQT оконное приложение на python

1) Комментарии на русском языке должны быть кириллическими.
2) textEdit_3 как я понял это QLineEdit. Так почему же ты в нём дату вводишь? Для даты есть соответствующий виджет.
3) На каждое окно нужно писать отдельный класс.
4) Не надо 3 окна открывать и потом их скрывать. Делай всё в одном окне.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Окт. 27, 2017 12:07:42

Ainur
Зарегистрирован: 2017-10-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

PYQT оконное приложение на python

Rodegast
1) Комментарии на русском языке должны быть кириллическими.
Скрипт запускаю в pycharm и spyder, у них свои глюки. И кириллица превращается в ?
Rodegast
.2) textEdit_3 как я понял это QLineEdit. Так почему же ты в нём дату вводишь? Для даты есть соответствующий виджет.
В базе дата в формате тхт, так уж было сделано до меня, поэтому и вводим дату просто как текст
Rodegast
3) На каждое окно нужно писать отдельный класс.
Пробовала, но че т у мя так не работает
 class MyWin(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyWin, self).__init__()
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_TVMA()
        self.ui.setupUi(self)
        # sobitia pri najatii na knopki
        self.ui.pushButton.clicked.connect(self.MyFunction)
        self.ui.btn_load.clicked.connect(self.loadData)
        self.ui.btn_check.clicked.connect(self.openSub)
    def openSub(self):
        self.sub = newWindow()
        self.sub.show()
 class newWindow(QtGui.QWidget):
    def __init__(self, parent = None):
        super(newWindow, self).__init__(parent)
        self.window = QtGui.QMainWindow()
        self.ui = Ui_CheckWindow()
        self.ui.setupUi(self)
        self.show()
        #myapp.hide()
        self.ui.table_check.setRowCount(0)
    def checkData(self):
        connection = pypyodbc.connect('Driver={SQL Server};Server=*;Database=*;uid=*;pwd=*')
        cursor = connection.cursor()
        #code=self.ui.textEdit_4.toPlainText() #vvod daty proverki s ekrana
        db =  ("""
                SET NOCOUNT ON;  --obhodim problemu s temptable
                update dbo.TVMA_IMPORT set Sname = REPLACE(Sname,'/','')	from dbo.TVMA_IMPORT
                GO
                if OBJECT_ID('tempdb..##tmp') is null
	                create table ##tmp (v1 datetime, v2 datetime, pt_id int, th_id int, stmom int, type int, xx_id int, lg_id int, dur int, note varchar(100))
                else truncate table ##tmp
                declare @day int,
            		       @save char(1)
                set @day = datediff(day,'19900101', '20171012')
                set @save = 'N'; insert ##tmp exec dbo.spkz_tvma_prot_generation  @day, @save;""") #%code)
        dbc=("SELECT TOP (1000) [Date],[PTime],[PName],[BNo],[BTime],[BB],[BType],[SPos],[SName],[SDur] from test")
        cursor.execute(db)
        cursor.execute("select * from ##tmp where xx_id = -1;")
        res=cursor.fetchall()
        #result1 = connection.execute(db)
        for row_number, row_data in enumerate(res):
            self.ui.table_check.insertRow(row_number)
            for column_number, data in enumerate(row_data):
                self.ui.table_check.setItem(row_number, column_number, QtGui.QTableWidgetItem(str(data).decode('cp1251')))
        connection.commit()
Rodegast
4) Не надо 3 окна открывать и потом их скрывать. Делай всё в одном окне.

во втором окне выводится таблица проверки данных, по запросу с базы, в третьем тоже таблица по другому запросу с базы. Структура таблицы разная. Зачем в главном окне выводить еще 2 таблицы, это же не красиво, а тут проверил закрыл.


Офлайн

#7 Окт. 27, 2017 12:12:23

Ainur
Зарегистрирован: 2017-10-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

PYQT оконное приложение на python

PEHDOM
вобщем чутка понятно, хотя всеравно лучше бы иметь скрипт который можно у себя запустить, и посмотреть ручками, а пока то что бросается , так сказать в глаза.
Да, это я уже поняла. Как быть теперь? Может после второго окна обратно открывать главное, но это будет совсем по колхозному. Кажется лучший вариант все 3 окна по разным классам разбить. Но не работает у меня с отдельного класса. В комментарий выше указала частичку где пытаюсь новый класс реализовать

Офлайн

#8 Окт. 27, 2017 12:52:58

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

PYQT оконное приложение на python

> Скрипт запускаю в pycharm и spyder, у них свои глюки. И кириллица превращается в ?

От pycharm можно ждать всё что угодно, но spyder отлично работает:


> В базе дата в формате тхт, так уж было сделано до меня, поэтому и вводим дату просто как текст

Ни разу не аргумент.

> Пробовала, но че т у мя так не работает

Я был бы удивлён если бы это у тебя заработало.

> Структура таблицы разная. Зачем в главном окне выводить еще 2 таблицы, это же не красиво, а тут проверил закрыл.

Тогда зачем главное окно скрывать?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Окт. 27, 2017 13:24:23

Ainur
Зарегистрирован: 2017-10-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

PYQT оконное приложение на python

Rodegast
> Скрипт запускаю в pycharm и spyder, у них свои глюки. И кириллица превращается в ?От pycharm можно ждать всё что угодно, но spyder отлично работает:> В базе дата в формате тхт, так уж было сделано до меня, поэтому и вводим дату просто как текстНи разу не аргумент.> Пробовала, но че т у мя так не работаетЯ был бы удивлён если бы это у тебя заработало.> Структура таблицы разная. Зачем в главном окне выводить еще 2 таблицы, это же не красиво, а тут проверил закрыл.Тогда зачем главное окно скрывать?
Spyder мне тоже больше нравился, вот только с pyqt он совсем не хочет дружить. При повторном запуске скрипта вываливается ошибка и переподключение ядра только помогает.
Если бы у меня заработало вряд ли я сидела бы на форуме и просила помощи, и вам не кажется что вы немного от темы отходите. Основную задачу решить помочь можете?

Прикреплённый файлы:
attachment 1jpg.jpg (251,3 KБ)

Офлайн

#10 Окт. 27, 2017 13:26:44

Ainur
Зарегистрирован: 2017-10-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

PYQT оконное приложение на python

Rodegast
> Тогда зачем главное окно скрывать?
Главное окно скрыла просто потому что оно уже не активное. Его надо оставить и чтобы оно так же функционировало дальше. Спасибо за комменты, учту. Но сейчас как с осовной проблемой разобраться…

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version