Функция bind. () отправляет только последний аргумент - PullRequest
0 голосов
/ 28 марта 2019

Я работаю над программой чата на python, используя tkinter, и я хочу, чтобы пользователь мог щелкнуть по имени и открыть чат в новом окне tkinter, но когда я нажимаю на имена, через него пропускается только фамилия .

Изначально я использовал цикл while для циклического просмотра разных пользователей в базе данных.

В надежде, что ошибка будет исправлена, я переключился на цикл for, но ничего не изменилось.

Это мой текущий код:

def openchat(event):
root= Tk()
root.title(contactname)
print("everything binds to this")
print("contactname: %s" % contactname)


def contacts():

c.execute("SELECT contact_id FROM contacts WHERE user_id = ?", (session_id[0], ))
row = c.fetchall();

print("prints contact id: %s" % row, "\n")
rowlength = len(row)
x = 0
print(row[x][0])

#while x < rowlength:
for i in row:
    c.execute("SELECT * FROM users WHERE user_id = ?", (row[x][0], ))
    row2 = c.fetchone();
    print("('contact_id', 'contactname', 'password', 'chat_id')")
    print(row2)
    contactname[0] = row2[1]
    print("contactname: %s" % contactname, "x: %s" % x, "\n")
    contactframe = Frame(leftframe, bg="#00A098", highlightthickness=2.5, highlightbackground="Black")
    contactframe.pack(side = TOP, fill=X)
    contactframe.bind("<Button-1>", lambda event: openchat(contactname))
    n = Label(contactframe, text=contactname, fg="Black", bg='#00A098')
    n.config(font=("Ariel", 20))
    n.bind("<Button-1>", lambda event: openchat(contactname))
    n.pack()
    x+=1

Это вывод терминала, который я получаю при запуске программы:

contact function: 

prints contact id: [('2',), ('3',), ('4',)] 

2
('contact_id', 'contactname', 'password', 'chat_id')
('2', 'brian', 'brian', '2')
contactname: ['brian'] x: 0 

('contact_id', 'contactname', 'password', 'chat_id')
('3', 'abdi', 'abdi', '3')
contactname: ['abdi'] x: 1 

('contact_id', 'contactname', 'password', 'chat_id')
('4', 'john', 'john', '4')
contactname: ['john'] x: 2 

Все вышеперечисленное работает отлично, как и ожидалось, но здесь я все испортил. Все привязывается к последнему контакту, Джон

contactname: ['john']
contactname: ['john']
contactname: ['john']

Но должно отображаться что-то вроде этого:

contactname: ['brian']
contactname: ['abdi']
contactname: ['john']

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

Было бы очень признательно, если бы кто-нибудь показал мне, где я что-то сделал не так, или указал мне правильное направление.

Заранее спасибо

=============

Я нашел решение, которое сработало для меня, вот мой окончательный код на тот случай, если у кого-то еще есть подобная проблема:

def openchat(i):
  c.execute("SELECT * FROM users WHERE user_id = ?", (i, ))
  row = c.fetchall();
  contactname = row[0][1]
  root= Tk()
  root.title(contactname)
  print("contactname: %s" % contactname)


def contacts(self):

  c.execute("SELECT contact_id FROM contacts WHERE user_id = ?", (session_id[0], ))
  row = c.fetchall();

  print("prints contact id: %s" % row, "\n")
  rowlength = len(row)
  minrow = min(row)
  maxrow = max(row)
  minrow2 = minrow[0]
  maxrow2 = maxrow[0]
  minrow2 = int(minrow2)
  maxrow2 = int(maxrow2)
  x = 0
  print(row[x][0])

  for i in range(minrow2,maxrow2+1):

      self.contact_id = i
      c.execute("SELECT * FROM users WHERE user_id = ?", (row[x][0], ))
      row2 = c.fetchone();
      print(row2)
      contactname[0] = row2[1]
      print("contactname: %s" % contactname, "x: %s" % x, "\n")
      contactframe = Frame(leftframe, bg="#00A098", highlightthickness=2.5, highlightbackground="Black")
      contactframe.pack(side = TOP, fill=X)
      n = Button(contactframe, text=contactname, fg="Black", bg='#00A098', command = lambda i=i: openchat(i))
      #n.config(font=("Ariel", 20))
      n.pack()
      x+=1

1 Ответ

0 голосов
/ 28 марта 2019

Комментарий : при использовании 'text' я получаю эту ошибку _tkinter.TclError: unknown option "-text"

У меня работает следующее:

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        n = tk.Label(self, text='test', fg="Black", bg='#00A098')
        n.config(font=("Ariel", 20))
        n.bind("<Button-1>", self.openchat)
        n.grid(row=0, column=0)

    def openchat(self, event):
        print("event from {}".format(type(event.widget))
        # >>> event from <class 'tkinter.Label'>
        print("event from {}".format(event.widget['text']))
        # >>> event from test

if __name__ == "__main__":
    App().mainloop()

Протестировано с Python: 3,5 - 'TclVersion': 8,6 'TkVersion': 8,6

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