Как динамически определять переменные имени окна - PullRequest
0 голосов
/ 28 января 2019

Мне нужно указать идентификатор окна в имени переменной окна.

Мне нужно динамически создать несколько окон с таблицами координат и иметь возможность ссылаться на каждое из них.Когда я использую этот код снизу, я могу вызвать только последнее сделанное окно.Я попытался определить окна следующим образом:

    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 голосов
/ 28 января 2019

Чисто технический ответ: вы хотите 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 / правильное использование db-api is:

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"

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