如何动态定义窗口名称变量

时间:2019-01-28 11:42:36

标签: python variables pyqt

我需要将窗口ID放在窗口变量名称中。

我需要使用坐标表动态创建几个窗口,并能够引用每个窗口。 当我从下面使用此代码时,我只能调用最后创建的窗口。 我试图用这种方式定义窗口:

    getattr(self, "tb_points%i" % i) = QtGui.QMainWindow()

但这给我一个错误:

    SyntaxError: can't assign to function call

代码:

import sqlite3
conn = sqlite3.connect('database.db')
tables = conn.execute("select id from points group by table_id").fetchall()
for i in range(len(tables)):
    tab_id = unicode(tables[i][0])
    q = conn.execute("select * from points where tab_id='"+tab_id+"'").fetchall()
    self.tb_points = QtGui.QMainWindow()
    self.tv_points = QtGui.QTableView()
    self.tv_model = QtGui.QStandardItemModel(len(q), 7, self)

我想能够打电话,例如:
self.tv_points5.setModel(self.tv_model5)
self.tb_points5.show()
self.tb_points3.hide()

1 个答案:

答案 0 :(得分:0)

纯粹的技术回答是您想要setattr(obj, name, value)

setattr(self, "tb_points%i" % i, QtGui.QMainWindow())

但是这是一个众所周知的反模式(您将如何使用不知道?名称的属性),因此适当的设计是使用列表或字典,即:

self.dyn_windows = []
# unrelated : python "for" loops are of the "foreach" kind
for tab_id in tables:
    # ...
   # for each tab_id, we store a dict referencing the three related windows
   self.dyn_windows.append({
      "tb_points": QtGui.QMainWindow(),
      "tv_points": QtGui.QTableView(),
      "tv_model": QtGui.QStandardItemModel(len(q), 7, self)
      })

也(无关),

1 / the proper use of the db-api是:

cursor = conn.cursor()
# nb: the exact placeholder depends on your db vendor
cursor.execute("select * from xxxx where tab_id=%", [tab_id])

2 /在不知道您的数据库模式以及您到底想做什么的情况下,我无法给出一个有效的示例,但是如果您要的是“ table_id”列表(或者此“ tab_id”列表)? ):点数”,使用聚合肯定有更好的方法,即"select tab_id, count(*) from points group by tab_id"