通过按钮Tikinter python 3传递输入

时间:2018-10-08 07:36:58

标签: python python-3.x tkinter

我是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的一列 我想传递我单击的右列

我的第二个问题是我想单击保存更改主数据并更正它。 有什么解决办法吗?

1 个答案:

答案 0 :(得分:0)

首先,对您的代码进行一些建设性的评论:

  1. 请确保您的代码行少于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), 

您的其他问题:

  1. inside_Tables不与您的主窗口通信,它会更改类范围内的数据,但不会更改属于另一个类的主应用程序中的数据。
  2. 我还认为您的按钮/标签可以由另一个类表示,这将使您可以使其包含自己的数据,而不必担心其余的问题。

我在下面修改了您的代码以使其正常工作(有些事情现在无用了,我建议清理),现在您只需要一个文件,我相信您的代码的第二部分意味着另一个名为tabels的文件.py,我将其包含在主代码中。

  

更改:   而不是从tkinter导入*   您的程序现在使用   将tkinter导入为tk   以便更好地了解自己在做什么。现在,在代码中使用Button或Entry时,它现在使用tk.Button,tk.Entry,tk.Tk和tk.StringVar,因此您知道它们来自tkinter。

     

课程:

     
      
  1. 添加了TableRow:此类用于管理包含主要数据的“ x”中的每个数据条目。
  2.   
  3. 已改进:已清理的版本,现在它是您的主要应用程序,我使它继承自tk.Tk,以便您调用它时绘制窗口。
  4.   
  5. inside_Tables:经过清理的版本,因此它可以通过master和tkinter stringvars与您的主应用程序通信。
  6.   

如有疑问,请发表评论。

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()