Displaying real-time data on a 2nd window
-
class Town(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): import sys from PyQt5.QtWidgets import QWidget,QPushButton,QApplication,QListWidget,QGridLayout,QLabel from PyQt5.QtCore import QTimer,QDateTime from PyQt5 import QtWidgets from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5 import QtCore win = QWidget() grid=QGridLayout() import pandas ct = pandas.read_csv('CurrentTown.csv') town = QLabel("town:") town.setStyleSheet("border: 1px solid black; background-color: yellow") grid.addWidget(town, 1,1) textEdit_1 = QLineEdit(ct) textEdit_1.textChanged[str].connect(self.onChanged) textEdit_1.setReadOnly(True) grid.addWidget(textEdit_1,1,2) import os os.remove('CurrentTown.csv') self.setLayout(grid) win.setGeometry(100,100,200,100) win.setWindowTitle("Test") win.show() def onChanged(self, text): self.textEdit_1.setText(str(ct))
Any ideas??
@john_hobbyist said in Displaying real-time data on a 2nd window:
textEdit_1.textChanged[str].connect(self.onChanged)
I already said. You think you want to connect
QLineEdit.textChanged
signal to do something. That is when something changes the text. But you don't have anything changing the text. You need a signal for when the file content changes to connect to a slot to change the text in the line edit.You claimed you had it working printing on terminal fine, but I don't see that.
Conceptually the code you have to read the file must be in a method called when the text in the file is changed. You have all this code in the constructor of the
Town
widget, which cannot be right.There is no connection at all between your
textEdit_1 = QLineEdit(ct)
and theself.textEdit_1.setText(str(ct))
you use later. Please review local versus member variables in Python.You don't want to have any
self.textEdit_1
in classTown
as the line edit you want to address is not on theTown
widget, it is on thewin
widget.Start by creating a separate Python module and class for your second window. Put the code to read the file and set the line edit text there. Then in this
Town
module create an instance of that class and show it. InTown
you will have some connection like:self.signalForFileDataChanged.connect(self.otherWindow.onFileDataChanged)
where the second window's
onFileDataChanged()
reads the new text from the file and sets its line edit.When you have that working you may see that you could have the
Town.signalForFileDataChanged()
signal send a parameter of the new town name to theOtherWindow.onFileDataChanged()
slot for it to show. Then you can ditch having them communicate via the content of an external file. -
I have another method that I want to call from another class. I have this code:
class Two(CentralWindow): def do_something(self, checked): . . .
I want to call the do_something method from initUI(self) ??
I have tried google search solutions, but they show to call a method outside a class/method. I need to call the do_something method from inside initUI(self) method.... -
I have another method that I want to call from another class. I have this code:
class Two(CentralWindow): def do_something(self, checked): . . .
I want to call the do_something method from initUI(self) ??
I have tried google search solutions, but they show to call a method outside a class/method. I need to call the do_something method from inside initUI(self) method....@john_hobbyist
Fundamental Python. Nothing special aboutinitUI(self)
.- From within
class Two
:self.do_something(checked)
. - From outside
class Two
:class_two_instance.do_something(checked)
.
- From within
-
This post is deleted!
-
In order to start from somewhere, after your very useful comments I did a change in the code so that when the ct changes to call the method def onChanged(self, text) which prints "OK". However, this happens only the first time that ct changes value. All the next times it does not print "OK"...What do I miss here???
-
I may sound harsh but: proper architecture.
I would suggest to start with something really minimal to just learn to use signals and slots properly, how to manage multiple different complex widgets that are only linked together by signals and slots.
-
I am trying! How can I call a method before declaring it?
-
You just don't.
As I already suggested: start with Qt's basics.
- Single widget with signals and slots within it.
- Second widget completely unrelated to the first one
- Connect them only after they both properly work independently
- While doing that: write unit tests
-
@SGaist Thank you, I will try it.
Please tell me a reason that the code runs commands such as open/make a widget + QLinedit + QLabels (I checked it with print commands) but I see only the widget (window) and nothing inside... What is wrong?
-
@SGaist Thank you, I will try it.
Please tell me a reason that the code runs commands such as open/make a widget + QLinedit + QLabels (I checked it with print commands) but I see only the widget (window) and nothing inside... What is wrong?
@john_hobbyist said in Displaying real-time data on a 2nd window:
What is wrong?
Please show the code, else only guessing is possible!
Did you add these widgets to your container widget (main window or whatever)? -
I am trying to embed a grid layout to the right side of the mainwidget. Imagine that I have divided the mainwidget area into 2 areas, left and side. I get this error though:
File "code.py", line 1643, in __init__ mylayout.addWidget(self.imageviewer, 1, 1) TypeError: addWidget(self, QWidget, stretch: int = 0, alignment: Union[Qt.Alignment, Qt.AlignmentFlag] = Qt.Alignment()): argument 3 has unexpected type 'int'
What did I do wrong?
-
Are you sure mylayout is a QGridLayout ?
-
I have it like this:
mylayout = QHBoxLayout()
-
So since it's a QHBoxLayout, why are you trying to use it like a grid layout ?
The error message tells you exactly the problem you have. If you read the method documentation, you'll see that the second parameter shall be a value from the Alignment enum.
-
This post is deleted!
-
This post is deleted!
@john_hobbyist said in Displaying real-time data on a 2nd window:
mylayout.addWidget(self.imageviewer, 1, 1)
You're not reading @SGaist's replies and understanding/acting on them. Anyway, what do you intend this line to do?
-
I call the above class each time the mouse pointer changes position. The problem is that nothing is shown..but the print commands that I have embed between the below commands work!
Why?
I call it like this:w = Town() w.show()
This is the class that I call
class Town(QWidget): def __init__(self): super().__init__() import sys from PyQt5.QtWidgets import QWidget,QPushButton,QApplication,QListWidget,QGridLayout,QLabel from PyQt5.QtCore import QTimer,QDateTime from PyQt5 import QtWidgets from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5 import QtCore win = QWidget() grid=QGridLayout() import pandas ct = pandas.read_csv('CurrentTown.csv') town = QLabel("town:") town.setStyleSheet("border: 1px solid black; background-color: yellow") grid.addWidget(town, 1,1) textEdit_1 = QLineEdit(ct) textEdit_1.setReadOnly(True) grid.addWidget(textEdit_1,1,2) import os os.remove('CurrentTown.csv') self.setLayout(grid) win.setGeometry(100,100,200,100) win.setWindowTitle("Test") win.show() win.update()
-
I call the above class each time the mouse pointer changes position. The problem is that nothing is shown..but the print commands that I have embed between the below commands work!
Why?
I call it like this:w = Town() w.show()
This is the class that I call
class Town(QWidget): def __init__(self): super().__init__() import sys from PyQt5.QtWidgets import QWidget,QPushButton,QApplication,QListWidget,QGridLayout,QLabel from PyQt5.QtCore import QTimer,QDateTime from PyQt5 import QtWidgets from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5 import QtCore win = QWidget() grid=QGridLayout() import pandas ct = pandas.read_csv('CurrentTown.csv') town = QLabel("town:") town.setStyleSheet("border: 1px solid black; background-color: yellow") grid.addWidget(town, 1,1) textEdit_1 = QLineEdit(ct) textEdit_1.setReadOnly(True) grid.addWidget(textEdit_1,1,2) import os os.remove('CurrentTown.csv') self.setLayout(grid) win.setGeometry(100,100,200,100) win.setWindowTitle("Test") win.show() win.update()
@john_hobbyist said in Displaying real-time data on a 2nd window:
I call it like this:
Where?
Please show that part of your code.
Also, why do you create a new QWidget in Town which does not contain anything? Town is already a QWidget. -
@john_hobbyist said in Displaying real-time data on a 2nd window:
I call it like this:
Where?
Please show that part of your code.
Also, why do you create a new QWidget in Town which does not contain anything? Town is already a QWidget.@jsulm said in Displaying real-time data on a 2nd window:
@john_hobbyist said in Displaying real-time data on a 2nd window:
I call it like this:
Where?
Please show that part of your code.
Also, why do you create a new QWidget in Town which does not contain anything? Town is already a QWidget.You mean this (?) :
win = QWidget() . . . win.setGeometry(100,100,200,100) win.setWindowTitle("Test") win.show() win.update()
So, class Town(QWidget): makes a widget before the previous code...(?)