Сначала несколько конструктивных комментариев к вашему коду:
Пожалуйста, сделайте ваши строки кода менее 80 символов для улучшения читаемости.
- Списоквсегда может отображаться в несколько строк.Например:
x = [['alireza', '2', '3'], ['amir', '5', '6'], ['hossein', '8', '9'], ['hamidreza', 'aghamiri', '09126993613'], ['hamidreza', 'aghamiri', '09126993613']] # dar daste aval size colomn ha ham neveshte shode
становится:
x = [
['alireza', '2', '3'],
['amir', '5', '6'],
['hossein', '8', '9'],
['hamidreza', 'aghamiri', '09126993613'],
['hamidreza', 'aghamiri', '09126993613']
]# dar daste aval size colomn ha ham neveshte shode
Когда вы определяете атрибуты виджета: если вы нажмете на конец строки, просто разбейте свои определениялибо 1 / строка для лучшей читабельности, либо, по крайней мере, нажмите Enter, чтобы начать новую строку определения ... в последнем случае не width = 1 , а вместо width = 1 например:
1027 *
становится:
for i, item in enumerate(self.data):
Button(self.root,
text=(self.data[i][0]),
command = lambda: self.Command(i),
height = 1, width = 15).grid(column = 0, row = i + 1)
Именно с лямбдой у вас возникла проблема, связанная с вашей первой проблемой;каждый раз, когда ваш цикл передает это вашему виджету:
command = lambda: self.Command(i),
Это заставляет его менять другие виджеты.Чтобы сделать его динамическим, используйте лямбда-переменную «x» и присвойте ей «i», а затем передайте «x» вашему self.Command: Это позволит всем вашим виджетам распознавать его «i»
command = lambda x = i: self.Command(x),
Ваша другая проблема:
- inside_Tables не связывается с вашим главным окном, он изменяет данные в области видимости класса, но не в основном приложении, которое является другим классом.
- IТакже подумайте, что ваши кнопки / метки могут быть представлены другим классом, это позволит вам сделать так, чтобы он содержал свои собственные данные, не беспокоясь об остальных.
Я изменил ваш код ниже, чтобызаставить его работать (есть некоторые вещи, которые теперь бесполезны, я рекомендую очистить), теперь вам понадобится только один файл, я полагаю, что ваша вторая часть кода подразумевает другой файл с именем tabels.py, который я включил в основной код,
изменяется: вместо из tkinter import * ваша программа теперь использует import tkinter as tk для лучшего понимания того, что вы делаете.при использовании Button или Entry в вашем коде теперь он использует tk.Button, tk.Entry, tk.Tk и tk.StringVar, так что вы знаете, что они происходят из tkinter.
classes:
- добавлен TableRow: этот класс управляет каждым вводом данных из 'x', который содержит ваши основные данные.
- Улучшено: исправленная версия, теперь это ваше основное приложение, я сделал его наследником от tk.Tk, чтобы окно отображалось при его вызове.
- inside_Tables: очищенная версия, поэтому оно связывается с вашим основным приложением через строки master и tkinter.
Если выесть вопросы, пожалуйста, прокомментируйте.
import tkinter as tk
#from tabels import * # I guess both classes were coded in different files?
class TableRow(tk.Frame):
''' Making each data row an object for better use of data. '''
def __init__(self, master, i):
tk.Frame.__init__(self, master)
self.data = master.data[i]
self.command_text = tk.StringVar(value=self.data[0])
self.label1_text = tk.StringVar(value=self.data[1])
self.label2_text = tk.StringVar(value=self.data[2])
self.grid()
button = tk.Button(self,
#text=self.data[0],
textvariable=self.command_text,
command=lambda x=i: self.Command(x),
width=11)
button.grid(column=0, row=0)
label = tk.Label(self,
#text=self.data[1],
textvariable=self.label1_text,
borderwidth = 1, bg = 'white', relief = 'solid',
fg = 'black', font = 'times 13 bold', height = 1,
width = 11)
label.grid(column=1, row=0)
label = tk.Label(self,
#text = self.data[2],
textvariable=self.label2_text,
borderwidth = 1, bg = 'white', relief = 'solid', fg = 'black',
font = 'times 13 bold', height = 1, width=11)
label.grid(column=2, row=0)
def Command(self, i):
inside_Tables(self, i)
class Improved(tk.Tk):
def __init__(self, data):
tk.Tk.__init__(self)
self.data = data
#self.entry = [] #Not used in this class.
#self.Grid_buttom()
self.grid()
#self.text()
def grid(self):
topframe = tk.Frame(self)
topframe.grid()
x = ['Name', 'Last name', 'Numbers']
for i in x:
tk.Label(topframe,
text=i, borderwidth=1, bg='white',
relief='solid', fg='Black',
font="Times 13 bold", height=1,
width=11).grid(column=x.index(i), row=0)
for i, item in enumerate(self.data):
TableRow(self, i)
class inside_Tables():
def __init__(self, master, i):
self.master = master
self.data=self.master.data
self.root=tk.Tk()
self.entry=[]
self.Grid()
self.Buttom()
self.root.mainloop()
def Grid(self):
'''it defines grids Of our TK ..incloud our rows and coloumns'''
k = 0
for i in range(len(self.data)):
v = tk.StringVar(self.root, value=self.data[i])
self.entry.append(tk.Entry(self.root, textvariable=v))
self.entry[k].grid(row=1, column=i)
k = k + 1
def Buttom(self):
tk.Button(self.root,
text="Save", command=self.Command,
height=1, width=11).grid(row=2, column=int(len(self.data)/2)-1,
sticky='NSEW')
def Command(self):
xx = []
#y = [] #now useless
output = []
for i in range(len(self.entry)):
output.append(self.entry[i].get())
for j in range(len(self.data)):
xx.append(output[j])
#y.append(xx)
#self.new_data=y
self.master.command_text.set(xx[0])
self.master.label1_text.set(xx[1])
self.master.label2_text.set(xx[2])
self.root.destroy()
x = [
['alireza', '2', '3'],
['amir', '5', '6'],
['hossein', '8', '9'],
['hamidreza', 'aghamiri', '09126993613'],
['hamidreza', 'aghamiri', '09126993613']
] # dar daste aval size colomn ha ham neveshte shode
#y = Improved(x) # Removed, included below to make program standalone.
if __name__ == '__main__':
y = Improved(x)
y.mainloop()