Move button functions outside main.py
-
Hello, iam wondering if is possible to make in PyQt5 file for design of my app and file for functionality of my app. By this i mean for example buttons, every button in code is connected to some funtion. I want to store these functions outside file where is defined button. Issomething like this possible ?
Example code - function click is in same file where button is created, how can i move this function in another file and make it work ? So by this i mean for example create Buttons.py file and store all functions of buttons there
from PyQt5 import QtWidgets import sys from PyQt5.QtWidgets import QMainWindow, QApplication, QLineEdit class Window(QMainWindow): def kokot(self): super().__init__() self.setWindowTitle("Samuel") self.setGeometry(200, 200, 259, 258) self.textbox = QLineEdit(self) self.textbox.move(5, 5) self.textbox.resize(188, 35) self.textboxValue = self.textbox.text() self.b1 = QtWidgets.QPushButton(self) self.b1.setText("0") self.b1.move(68, 219) self.b1.resize(60, 35) self.b1.clicked.connect(self.click) self.show() def click(self): <----- THIS FUNCTION OUTSIDE THIS FILE self.texbox.setText("HELLO WORLD") if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.kokot() sys.exit(app.exec()) -
Hi,
Since you are manipulating your Window internal state in the click method, you should rather move the whole class outside that file.
-
Hello, iam wondering if is possible to make in PyQt5 file for design of my app and file for functionality of my app. By this i mean for example buttons, every button in code is connected to some funtion. I want to store these functions outside file where is defined button. Issomething like this possible ?
Example code - function click is in same file where button is created, how can i move this function in another file and make it work ? So by this i mean for example create Buttons.py file and store all functions of buttons there
from PyQt5 import QtWidgets import sys from PyQt5.QtWidgets import QMainWindow, QApplication, QLineEdit class Window(QMainWindow): def kokot(self): super().__init__() self.setWindowTitle("Samuel") self.setGeometry(200, 200, 259, 258) self.textbox = QLineEdit(self) self.textbox.move(5, 5) self.textbox.resize(188, 35) self.textboxValue = self.textbox.text() self.b1 = QtWidgets.QPushButton(self) self.b1.setText("0") self.b1.move(68, 219) self.b1.resize(60, 35) self.b1.clicked.connect(self.click) self.show() def click(self): <----- THIS FUNCTION OUTSIDE THIS FILE self.texbox.setText("HELLO WORLD") if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.kokot() sys.exit(app.exec())@Samuel-Bachorik said in Move button functions outside main.py:
class Window(QMainWindow): def kokot(self): super().__init__()In addition to @SGaist. In your other thread with similar question, he already told you this is incorrect/bad, and what to do about it. It would be really good if you heeded people's answers and applied what they said rather than ignoring it.
-
@JonB i always take tips from you but in this question, ↓ iam using __ init __ and he said it is bad that i use constructor. Here in this older question iam using __ init __ and he said it is wrong.... first reply in this question -> https://forum.qt.io/topic/122722/why-click-on-button-opens-new-pyqt-window/2
So after that question i made from def__ init __ (self): TO def kokot(self):
-
It's absolutely not what I said. I told you that it was wrong to call the show method in the construction phase nothing else.
-
@JonB i always take tips from you but in this question, ↓ iam using __ init __ and he said it is bad that i use constructor. Here in this older question iam using __ init __ and he said it is wrong.... first reply in this question -> https://forum.qt.io/topic/122722/why-click-on-button-opens-new-pyqt-window/2
So after that question i made from def__ init __ (self): TO def kokot(self):
@Samuel-Bachorik , @SGaist
Actually that was not the @SGaist post I was thinking of. It was https://forum.qt.io/topic/122996/object-oriented-pyqt5-in-python-not-working/3 where he wrote:First thing:
kokotshould rather be__init__.And indeed that should have been the first thing you corrected. Anyway, I don't mean to be overly hard on you, so: please do so now, you should be calling your
super().__init__()from your own__init__(), not from some method namedkokot(). [If you really want, you could keep the otherself....initializations you do there in somekokot()you call, though I wouldn't recommend it, but thesuper().__init__()belongs in an__init__().] -
@JonB i always take tips from you but in this question, ↓ iam using __ init __ and he said it is bad that i use constructor. Here in this older question iam using __ init __ and he said it is wrong.... first reply in this question -> https://forum.qt.io/topic/122722/why-click-on-button-opens-new-pyqt-window/2
So after that question i made from def__ init __ (self): TO def kokot(self):
@Samuel-Bachorik
Back to your current intention/question:def click(self): <----- THIS FUNCTION OUTSIDE THIS FILE self.texbox.setText("HELLO WORLD")Why do you want to achieve that? The code you have in that slot alters something in
self, theWindowhere. The best place for this is indeed insideWindowwhere it is now. If you move it outside this class/module you will have to code some mechanism for it to access theWindow.textbox.There are cases where this makes sense (perhaps by emitting a signal) but you wanting to do it now seems to me to just introduce compliaction.
Now, it is a different question if you want that
click()slot outside ofWindowwhere nothing in the slot code will want to access/affect anything inWindow. And we can discuss that if you wish. But that's not the case you (currently) show. -
@SGaist I am sorry my bad, I misunderstood it, my apologize to you. @JonB Thank for reply, the main reason i want to do that is because i want to have my code more clear, when i look on internet and i see how very object oriented are all aplications i want to do same. My calculator is some bunch of code (which works actualy) where on top i have PyQt design (buttons,labels,plaintext) and under that 30 functions of buttons.... This code is really long after that and i wanted to make it more celar. When i code in Android studio for example, i have for everything its own class. For example ButtonManager, Design have xml. file. Mathematic operations have also its own class and i just call it from main class. But here in Python everything is written in one file and it is very unclear. So this is the reason why i want to do that.
Thank you.