Форум сайта python.su
Добрый день. Пишу приложение, которое при нажатии на кнопку выводит во втором окне запрос базы. Все работает. Вот только кнопка получается одноразовая, при повторном нажатии уже ничего не работает. Есть еще вторая кнопка которая выдает третье окно уже с результатом другого запроса, тоже работает, но как открылось второе или третье окно первое деактивируется. Как сделать чтобы оно оставалось активным и кнопки постоянно работали? Помогите пожалуйста
# -*- 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()
Офлайн
Ainurопишите поподробнее:
Вот только кнопка получается одноразовая, при повторном нажатии уже ничего не работает.
Ainurдеактивируется в смысле закрывается, тоесть исчезает, или просто с него фокус уходит?И опять же какое из окон у вас “первое”, “второе” и “третье”. мы опять должны угадывать?
но как открылось второе или третье окно первое деактивируется
[code python][/code]
Офлайн
PEHDOMВсе по порядку. Открывается главное окно. в textEdit_3 ввожу дату (переменная в запросе в базу). При нажатии на кнопку btn_load запускается функция loadData и открывается новое окно с отображением результата запроса
опишите поподробнее:
что это за кнопка , и что получается при повторном нажатии? с вашего обьяснения ничего непонятно, а догадаться както трудно не имея возможности запустить у себя ваш код.
self.window = QtGui.QMainWindow() self.ui = Ui_CheckWindow() self.ui.setupUi(self.window) self.window.show() myapp.hide()
PEHDOMуходит фокус, надо чтобы можно было работать с главным окном дальше. Первое это главное окно, а второе и третье это дополнительные окна, которые открываются по нажатию на кнопки в главном окне. Но после нажатия на одну из этих кнопок главное уже не реагирует ни на какие другие действия
деактивируется в смысле закрывается, тоесть исчезает, или просто с него фокус уходит?И опять же какое из окон у вас “первое”, “второе” и “третье”. мы опять должны угадывать?
Офлайн
вобщем чутка понятно, хотя всеравно лучше бы иметь скрипт который можно у себя запустить, и посмотреть ручками, а пока то что бросается , так сказать в глаза.
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) .........
[code python][/code]
Офлайн
1) Комментарии на русском языке должны быть кириллическими.
2) textEdit_3 как я понял это QLineEdit. Так почему же ты в нём дату вводишь? Для даты есть соответствующий виджет.
3) На каждое окно нужно писать отдельный класс.
4) Не надо 3 окна открывать и потом их скрывать. Делай всё в одном окне.
Офлайн
RodegastСкрипт запускаю в pycharm и spyder, у них свои глюки. И кириллица превращается в ?
1) Комментарии на русском языке должны быть кириллическими.
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 окна открывать и потом их скрывать. Делай всё в одном окне.
Офлайн
PEHDOMДа, это я уже поняла. Как быть теперь? Может после второго окна обратно открывать главное, но это будет совсем по колхозному. Кажется лучший вариант все 3 окна по разным классам разбить. Но не работает у меня с отдельного класса. В комментарий выше указала частичку где пытаюсь новый класс реализовать
вобщем чутка понятно, хотя всеравно лучше бы иметь скрипт который можно у себя запустить, и посмотреть ручками, а пока то что бросается , так сказать в глаза.
Офлайн
> Скрипт запускаю в pycharm и spyder, у них свои глюки. И кириллица превращается в ?
От pycharm можно ждать всё что угодно, но spyder отлично работает:
> В базе дата в формате тхт, так уж было сделано до меня, поэтому и вводим дату просто как текст
Ни разу не аргумент.
> Пробовала, но че т у мя так не работает
Я был бы удивлён если бы это у тебя заработало.
> Структура таблицы разная. Зачем в главном окне выводить еще 2 таблицы, это же не красиво, а тут проверил закрыл.
Тогда зачем главное окно скрывать?
Офлайн
RodegastSpyder мне тоже больше нравился, вот только с pyqt он совсем не хочет дружить. При повторном запуске скрипта вываливается ошибка и переподключение ядра только помогает.
> Скрипт запускаю в pycharm и spyder, у них свои глюки. И кириллица превращается в ?От pycharm можно ждать всё что угодно, но spyder отлично работает:> В базе дата в формате тхт, так уж было сделано до меня, поэтому и вводим дату просто как текстНи разу не аргумент.> Пробовала, но че т у мя так не работаетЯ был бы удивлён если бы это у тебя заработало.> Структура таблицы разная. Зачем в главном окне выводить еще 2 таблицы, это же не красиво, а тут проверил закрыл.Тогда зачем главное окно скрывать?
Прикреплённый файлы:
1jpg.jpg (251,3 KБ)
Офлайн
RodegastГлавное окно скрыла просто потому что оно уже не активное. Его надо оставить и чтобы оно так же функционировало дальше. Спасибо за комменты, учту. Но сейчас как с осовной проблемой разобраться…
> Тогда зачем главное окно скрывать?
Офлайн