我是python的新手,这是我的第一个代码。 我的目标是使可编辑表我使用了两个类 我主班的目标是将多个名称打印到一个表中:
from tkinter import *
from tabels import *
class Improved():
def __init__(self, data):
self.data = data
self.root = Tk()
self.entry = []
self.Grid_buttom()
self.text()
self.root.mainloop()
def Grid_buttom(self):
x = ['Name', 'Last name', 'Numbers']
for i in range(3):
Label(self.root, text=x[i], borderwidth=1, bg='white', relief='solid', fg='Black',
font="Times 13 bold", height=1, width=11).grid(column=i, row=0)
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)
def text(self):
'''text infront of bottoms'''
for i, item in enumerate(self.data):
Label(self.root, text=self.data[i][1],borderwidth=1,bg='white',relief='solid',fg='Black',
font="Times 13 bold", height = 1, width = 11 ).grid(column=1, row=i+1)
Label(self.root, text=self.data[i][2], borderwidth=1, bg='white', relief='solid', fg='Black',
font="Times 13 bold", height=1, width=11).grid(column=2, row=i+1)
def Command(self,i):
self.data[i]=inside_Tables(self.data[i])
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)
我的第二堂课将通过单击它来编辑主表的每一列
from tkinter import *
class inside_Tables():
def __init__(self, data):
self.data=data
self.root=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 = StringVar(self.root, value=self.data[i])
self.entry.append(Entry(self.root, textvariable=v))
self.entry[k].grid(row=1, column=i)
k = k + 1
def Buttom(self):
Button(self.root, text="Save", command=lambda: self.Command(),height=1, width=11).grid(row=2, column=int(len(self.data)/2)-1,sticky=NSEW)
def Command(self):
xx = []
y = []
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.root.destroy()
问题:
当我单击每一列进行编辑时,它总是通过i = 4的一列 我想传递我单击的右列
我的第二个问题是我想单击保存更改主数据并更正它。 有什么解决办法吗?
答案 0 :(得分:0)
首先,对您的代码进行一些建设性的评论:
请确保您的代码行少于80个字符,以提高可读性。
x = [['alireza','2','3'],['amir','5','6'],['hossein','8','9'], ['hamidreza','aghamiri','09126993613'], ['hamidreza','aghamiri','09126993613']]#达daste的aval尺寸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 例如:
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)
成为:
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)
您遇到的第一个问题就是lambda问题;每次循环将其传递给小部件时:
command = lambda: self.Command(i),
它可以更改其他小部件。 要使其动态,请使用lambda变量'x'并将其分配给'i',然后将'x'传递给自己。命令:这将使您的所有小部件都识别出它自己的'i'
command = lambda x = i: self.Command(x),
您的其他问题:
我在下面修改了您的代码以使其正常工作(有些事情现在无用了,我建议清理),现在您只需要一个文件,我相信您的代码的第二部分意味着另一个名为tabels的文件.py,我将其包含在主代码中。
更改: 而不是从tkinter导入* 您的程序现在使用 将tkinter导入为tk 以便更好地了解自己在做什么。现在,在代码中使用Button或Entry时,它现在使用tk.Button,tk.Entry,tk.Tk和tk.StringVar,因此您知道它们来自tkinter。
课程:
- 添加了TableRow:此类用于管理包含主要数据的“ x”中的每个数据条目。
- 已改进:已清理的版本,现在它是您的主要应用程序,我使它继承自tk.Tk,以便您调用它时绘制窗口。
- inside_Tables:经过清理的版本,因此它可以通过master和tkinter stringvars与您的主应用程序通信。
如有疑问,请发表评论。
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()