Передайте вход кнопкой Tikinter python 3 - PullRequest
0 голосов
/ 08 октября 2018

Я новичок в 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)

myвторой класс собирается редактировать каждый столбец нашей главной таблицы, щелкая по нему

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 голосов
/ 08 октября 2018

Сначала несколько конструктивных комментариев к вашему коду:

  1. Пожалуйста, сделайте ваши строки кода менее 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), 

Ваша другая проблема:

  1. inside_Tables не связывается с вашим главным окном, он изменяет данные в области видимости класса, но не в основном приложении, которое является другим классом.
  2. IТакже подумайте, что ваши кнопки / метки могут быть представлены другим классом, это позволит вам сделать так, чтобы он содержал свои собственные данные, не беспокоясь об остальных.

Я изменил ваш код ниже, чтобызаставить его работать (есть некоторые вещи, которые теперь бесполезны, я рекомендую очистить), теперь вам понадобится только один файл, я полагаю, что ваша вторая часть кода подразумевает другой файл с именем tabels.py, который я включил в основной код,

изменяется: вместо из tkinter import * ваша программа теперь использует import tkinter as tk для лучшего понимания того, что вы делаете.при использовании Button или Entry в вашем коде теперь он использует tk.Button, tk.Entry, tk.Tk и tk.StringVar, так что вы знаете, что они происходят из tkinter.

classes:

  1. добавлен TableRow: этот класс управляет каждым вводом данных из 'x', который содержит ваши основные данные.
  2. Улучшено: исправленная версия, теперь это ваше основное приложение, я сделал его наследником от tk.Tk, чтобы окно отображалось при его вызове.
  3. 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...