Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Post - nuzzopippo

Pagine: [1] 2 3 ... 8
1
Tkinter / Re:[Risolto] Elenco nomi dei colori in tkinter
« il: Dicembre 06, 2019, 12:27 »
Uhm, non è che proprio mai nessuno abbia mai pensato di fare una cosa del genere, eh  ;) http://www.science.smith.edu/dftwiki/index.php/Color_Charts_for_TKinter
beh ... c'è qualcosa di diverso ma stiamo li :)

In windows funziona, nel senso che i nomi dei colori sono hardcodati invece di stare in un file di testo, come dice la doc che ti ho linkato sopra... ma comunque i nomi sono sempre quelli.
e questo, io non l'avrei potuto sapere ... prima o poi dovrò decidermi di installare una versione di windows, giusto per qualche prova.

Comunque tieni presente che la programmazione è come la torta... la cosa che può servire non è pubblicare la foto della torta già fatta ma la ricetta per fare la torta.
In questo caso, il codice per parsare il file di testo, non il risultato del parsing. Il file sorgente potenzialmente potrebbe essere aggiornato in futuro...
:D ... hai ragione, certo che suggerire il mio codice qui mi sembra di commettere un peccato di presunzione, comunque, eccolo
f_names = 'colori_docs_tkinter'

f = open(f_names, 'r')
data_rows = f.read().splitlines()
f.close()
print('data_rows : ', str(len(data_rows)), 'elementi')
colors = {}
counter = 0
for r in data_rows:
    d = r.split()
    value = {}
    value['rgb'] = (int(d[-3]), int(d[-2]), int(d[-1]))
    value['hex'] = '#%02x%02x%02x' % (int(d[-3]), int(d[-2]), int(d[-1]))
    name = ' '.join(d[:-3])
    colors[name] = value
    counter += 1
    if len(d[:-3]) > 1:
         print('%d - valutato' % counter, name)
print('rows : ', str(len(colors)), 'elementi')

f = open('vocab_colori.py', 'w')
stringa = 'colors = {'
f.write(stringa)
stringa = '          '
primariga = True
for key in colors.keys():
    if primariga:
        riga = ''
        primariga = False
    else:
        riga = stringa
    riga += "'"+key+"': {'rgb': ("+str(colors[key]["rgb"][0])+", "+str(colors[key]["rgb"][1])+", "+str(colors[key]["rgb"][2])+")"+", 'hex': '"+colors[key]["hex"]+"'},\n"
    f.write(riga)
f.write('}')
f.close()
         
f = open('lst_nomi.py', 'w')
riga = 'colors = ['
for key in colors.keys():
    if len(riga+"'" + key + "'") < 79:
        riga += "'" + key + "', "
    else:
        f.write(riga + '\n')
        riga = "          " + "'" + key +"', "
f.write(riga)
f.write(']')
f.close()

era uno script "al volo" per crearmi una lista ed un vocabolario dei colori, compresi i valori rgb ed esadecimali, "colori_docs_tkinter" è il file in cui avevo depositato i dati "munti" da uno script bash.

Ciao :)

[Edit] dimenticavo, i dati nel file sono formattati così :

bisque3 205 183 158
bisque4 139 125 107
black 0 0 0
blanched almond 255 235 205
BlanchedAlmond 255 235 205
blue 0 0 255
...

2
Tkinter / Re:[Risolto] Elenco nomi dei colori in tkinter
« il: Dicembre 05, 2019, 17:20 »
Pur rendendomi conto che non sia un argomento al top degli interessi, come anticipato nel precedente post, approfittando di una insonnia, ho codificato una lista con tutti il 760 nomi colori presente nella pagina di documentazione della versione 8.4 di tkinter, la rendo disponibile nel caso vi sia qualche eventuale interessato.
Sono 152 righe entro i 79 caratteri.

colors = ['alice blue', 'AliceBlue', 'antique white', 'AntiqueWhite', 
          'AntiqueWhite1', 'AntiqueWhite2', 'AntiqueWhite3', 'AntiqueWhite4',
          'agua', 'aquamarine', 'aquamarine1', 'aquamarine2', 'aquamarine3',
          'aquamarine4', 'azure', 'azure1', 'azure2', 'azure3', 'azure4',
          'beige', 'bisque', 'bisque1', 'bisque2', 'bisque3', 'bisque4',
          'black', 'blanched almond', 'BlanchedAlmond', 'blue', 'blue violet',
          'blue1', 'blue2', 'blue3', 'blue4', 'BlueViolet', 'brown', 'brown1',
          'brown2', 'brown3', 'brown4', 'burlywood', 'burlywood1',
          'burlywood2', 'burlywood3', 'burlywood4', 'cadet blue', 'CadetBlue',
          'CadetBlue1', 'CadetBlue2', 'CadetBlue3', 'CadetBlue4', 'chartreuse',
          'chartreuse1', 'chartreuse2', 'chartreuse3', 'chartreuse4',
          'chocolate', 'chocolate1', 'chocolate2', 'chocolate3', 'chocolate4',
          'coral', 'coral1', 'coral2', 'coral3', 'coral4', 'cornflower blue',
          'CornflowerBlue', 'cornsilk', 'cornsilk1', 'cornsilk2', 'cornsilk3',
          'cornsilk4', 'crymson', 'cyan', 'cyan1', 'cyan2', 'cyan3', 'cyan4',
          'dark blue', 'dark cyan', 'dark goldenrod', 'dark gray',
          'dark green', 'dark grey', 'dark khaki', 'dark magenta',
          'dark olive green', 'dark orange', 'dark orchid', 'dark red',
          'dark salmon', 'dark sea green', 'dark slate blue',
          'dark slate gray', 'dark slate grey', 'dark turquoise',
          'dark violet', 'DarkBlue', 'DarkCyan', 'DarkGoldenrod',
          'DarkGoldenrod1', 'DarkGoldenrod2', 'DarkGoldenrod3',
          'DarkGoldenrod4', 'DarkGray', 'DarkGreen', 'DarkGrey', 'DarkKhaki',
          'DarkMagenta', 'DarkOliveGreen', 'DarkOliveGreen1',
          'DarkOliveGreen2', 'DarkOliveGreen3', 'DarkOliveGreen4',
          'DarkOrange', 'DarkOrange1', 'DarkOrange2', 'DarkOrange3',
          'DarkOrange4', 'DarkOrchid', 'DarkOrchid1', 'DarkOrchid2',
          'DarkOrchid3', 'DarkOrchid4', 'DarkRed', 'DarkSalmon',
          'DarkSeaGreen', 'DarkSeaGreen1', 'DarkSeaGreen2', 'DarkSeaGreen3',
          'DarkSeaGreen4', 'DarkSlateBlue', 'DarkSlateGray', 'DarkSlateGray1',
          'DarkSlateGray2', 'DarkSlateGray3', 'DarkSlateGray4',
          'DarkSlateGrey', 'DarkTurquoise', 'DarkViolet', 'deep pink',
          'deep sky blue', 'DeepPink', 'DeepPink1', 'DeepPink2', 'DeepPink3',
          'DeepPink4', 'DeepSkyBlue', 'DeepSkyBlue1', 'DeepSkyBlue2',
          'DeepSkyBlue3', 'DeepSkyBlue4', 'dim gray', 'dim grey', 'DimGray',
          'DimGrey', 'dodger blue', 'DodgerBlue', 'DodgerBlue1', 'DodgerBlue2',
          'DodgerBlue3', 'DodgerBlue4', 'firebrick', 'firebrick1',
          'firebrick2', 'firebrick3', 'firebrick4', 'floral white',
          'FloralWhite', 'forest green', 'ForestGreen', 'fuchsia', 'gainsboro',
          'ghost white', 'GhostWhite', 'gold', 'gold1', 'gold2', 'gold3',
          'gold4', 'goldenrod', 'goldenrod1', 'goldenrod2', 'goldenrod3',
          'goldenrod4', 'gray', 'gray0', 'gray1', 'gray2', 'gray3', 'gray4',
          'gray5', 'gray6', 'gray7', 'gray8', 'gray9', 'gray10', 'gray11',
          'gray12', 'gray13', 'gray14', 'gray15', 'gray16', 'gray17', 'gray18',
          'gray19', 'gray20', 'gray21', 'gray22', 'gray23', 'gray24', 'gray25',
          'gray26', 'gray27', 'gray28', 'gray29', 'gray30', 'gray31', 'gray32',
          'gray33', 'gray34', 'gray35', 'gray36', 'gray37', 'gray38', 'gray39',
          'gray40', 'gray41', 'gray42', 'gray43', 'gray44', 'gray45', 'gray46',
          'gray47', 'gray48', 'gray49', 'gray50', 'gray51', 'gray52', 'gray53',
          'gray54', 'gray55', 'gray56', 'gray57', 'gray58', 'gray59', 'gray60',
          'gray61', 'gray62', 'gray63', 'gray64', 'gray65', 'gray66', 'gray67',
          'gray68', 'gray69', 'gray70', 'gray71', 'gray72', 'gray73', 'gray74',
          'gray75', 'gray76', 'gray77', 'gray78', 'gray79', 'gray80', 'gray81',
          'gray82', 'gray83', 'gray84', 'gray85', 'gray86', 'gray87', 'gray88',
          'gray89', 'gray90', 'gray91', 'gray92', 'gray93', 'gray94', 'gray95',
          'gray96', 'gray97', 'gray98', 'gray99', 'gray100', 'green',
          'green yellow', 'green1', 'green2', 'green3', 'green4',
          'GreenYellow', 'grey', 'grey0', 'grey1', 'grey2', 'grey3', 'grey4',
          'grey5', 'grey6', 'grey7', 'grey8', 'grey9', 'grey10', 'grey11',
          'grey12', 'grey13', 'grey14', 'grey15', 'grey16', 'grey17', 'grey18',
          'grey19', 'grey20', 'grey21', 'grey22', 'grey23', 'grey24', 'grey25',
          'grey26', 'grey27', 'grey28', 'grey29', 'grey30', 'grey31', 'grey32',
          'grey33', 'grey34', 'grey35', 'grey36', 'grey37', 'grey38', 'grey39',
          'grey40', 'grey41', 'grey42', 'grey43', 'grey44', 'grey45', 'grey46',
          'grey47', 'grey48', 'grey49', 'grey50', 'grey51', 'grey52', 'grey53',
          'grey54', 'grey55', 'grey56', 'grey57', 'grey58', 'grey59', 'grey60',
          'grey61', 'grey62', 'grey63', 'grey64', 'grey65', 'grey66', 'grey67',
          'grey68', 'grey69', 'grey70', 'grey71', 'grey72', 'grey73', 'grey74',
          'grey75', 'grey76', 'grey77', 'grey78', 'grey79', 'grey80', 'grey81',
          'grey82', 'grey83', 'grey84', 'grey85', 'grey86', 'grey87', 'grey88',
          'grey89', 'grey90', 'grey91', 'grey92', 'grey93', 'grey94', 'grey95',
          'grey96', 'grey97', 'grey98', 'grey99', 'grey100', 'honeydew',
          'honeydew1', 'honeydew2', 'honeydew3', 'honeydew4', 'hot pink',
          'HotPink', 'HotPink1', 'HotPink2', 'HotPink3', 'HotPink4',
          'indian red', 'IndianRed', 'IndianRed1', 'IndianRed2', 'IndianRed3',
          'IndianRed4', 'indigo', 'ivory', 'ivory1', 'ivory2', 'ivory3',
          'ivory4', 'khaki', 'khaki1', 'khaki2', 'khaki3', 'khaki4',
          'lavender', 'lavender blush', 'LavenderBlush', 'LavenderBlush1',
          'LavenderBlush2', 'LavenderBlush3', 'LavenderBlush4', 'lawn green',
          'LawnGreen', 'lemon chiffon', 'LemonChiffon', 'LemonChiffon1',
          'LemonChiffon2', 'LemonChiffon3', 'LemonChiffon4', 'light blue',
          'light coral', 'light cyan', 'light goldenrod',
          'light goldenrod yellow', 'light gray', 'light green', 'light grey',
          'light pink', 'light salmon', 'light sea green', 'light sky blue',
          'light slate blue', 'light slate gray', 'light slate grey',
          'light steel blue', 'light yellow', 'LightBlue', 'LightBlue1',
          'LightBlue2', 'LightBlue3', 'LightBlue4', 'LightCoral', 'LightCyan',
          'LightCyan1', 'LightCyan2', 'LightCyan3', 'LightCyan4',
          'LightGoldenrod', 'LightGoldenrod1', 'LightGoldenrod2',
          'LightGoldenrod3', 'LightGoldenrod4', 'LightGoldenrodYellow',
          'LightGray', 'LightGreen', 'LightGrey', 'LightPink', 'LightPink1',
          'LightPink2', 'LightPink3', 'LightPink4', 'LightSalmon',
          'LightSalmon1', 'LightSalmon2', 'LightSalmon3', 'LightSalmon4',
          'LightSeaGreen', 'LightSkyBlue', 'LightSkyBlue1', 'LightSkyBlue2',
          'LightSkyBlue3', 'LightSkyBlue4', 'LightSlateBlue', 'LightSlateGray',
          'LightSlateGrey', 'LightSteelBlue', 'LightSteelBlue1',
          'LightSteelBlue2', 'LightSteelBlue3', 'LightSteelBlue4',
          'LightYellow', 'LightYellow1', 'LightYellow2', 'LightYellow3',
          'LightYellow4', 'lime', 'lime green', 'LimeGreen', 'linen',
          'magenta', 'magenta1', 'magenta2', 'magenta3', 'magenta4', 'maroon',
          'maroon1', 'maroon2', 'maroon3', 'maroon4', 'medium aquamarine',
          'medium blue', 'medium orchid', 'medium purple', 'medium sea green',
          'medium slate blue', 'medium spring green', 'medium turquoise',
          'medium violet red', 'MediumAquamarine', 'MediumBlue',
          'MediumOrchid', 'MediumOrchid1', 'MediumOrchid2', 'MediumOrchid3',
          'MediumOrchid4', 'MediumPurple', 'MediumPurple1', 'MediumPurple2',
          'MediumPurple3', 'MediumPurple4', 'MediumSeaGreen',
          'MediumSlateBlue', 'MediumSpringGreen', 'MediumTurquoise',
          'MediumVioletRed', 'midnight blue', 'MidnightBlue', 'mint cream',
          'MintCream', 'misty rose', 'MistyRose', 'MistyRose1', 'MistyRose2',
          'MistyRose3', 'MistyRose4', 'moccasin', 'navajo white',
          'NavajoWhite', 'NavajoWhite1', 'NavajoWhite2', 'NavajoWhite3',
          'NavajoWhite4', 'navy', 'navy blue', 'NavyBlue', 'old lace',
          'OldLace', 'olive', 'olive drab', 'OliveDrab', 'OliveDrab1',
          'OliveDrab2', 'OliveDrab3', 'OliveDrab4', 'orange', 'orange red',
          'orange1', 'orange2', 'orange3', 'orange4', 'OrangeRed',
          'OrangeRed1', 'OrangeRed2', 'OrangeRed3', 'OrangeRed4', 'orchid',
          'orchid1', 'orchid2', 'orchid3', 'orchid4', 'pale goldenrod',
          'pale green', 'pale turquoise', 'pale violet red', 'PaleGoldenrod',
          'PaleGreen', 'PaleGreen1', 'PaleGreen2', 'PaleGreen3', 'PaleGreen4',
          'PaleTurquoise', 'PaleTurquoise1', 'PaleTurquoise2',
          'PaleTurquoise3', 'PaleTurquoise4', 'PaleVioletRed',
          'PaleVioletRed1', 'PaleVioletRed2', 'PaleVioletRed3',
          'PaleVioletRed4', 'papaya whip', 'PapayaWhip', 'peach puff',
          'PeachPuff', 'PeachPuff1', 'PeachPuff2', 'PeachPuff3', 'PeachPuff4',
          'peru', 'pink', 'pink1', 'pink2', 'pink3', 'pink4', 'plum', 'plum1',
          'plum2', 'plum3', 'plum4', 'powder blue', 'PowderBlue', 'purple',
          'purple1', 'purple2', 'purple3', 'purple4', 'red', 'red1', 'red2',
          'red3', 'red4', 'rosy brown', 'RosyBrown', 'RosyBrown1',
          'RosyBrown2', 'RosyBrown3', 'RosyBrown4', 'royal blue', 'RoyalBlue',
          'RoyalBlue1', 'RoyalBlue2', 'RoyalBlue3', 'RoyalBlue4',
          'saddle brown', 'SaddleBrown', 'salmon', 'salmon1', 'salmon2',
          'salmon3', 'salmon4', 'sandy brown', 'SandyBrown', 'sea green',
          'SeaGreen', 'SeaGreen1', 'SeaGreen2', 'SeaGreen3', 'SeaGreen4',
          'seashell', 'seashell1', 'seashell2', 'seashell3', 'seashell4',
          'sienna', 'sienna1', 'sienna2', 'sienna3', 'sienna4', 'silver',
          'sky blue', 'SkyBlue', 'SkyBlue1', 'SkyBlue2', 'SkyBlue3',
          'SkyBlue4', 'slate blue', 'slate gray', 'slate grey', 'SlateBlue',
          'SlateBlue1', 'SlateBlue2', 'SlateBlue3', 'SlateBlue4', 'SlateGray',
          'SlateGray1', 'SlateGray2', 'SlateGray3', 'SlateGray4', 'SlateGrey',
          'snow', 'snow1', 'snow2', 'snow3', 'snow4', 'spring green',
          'SpringGreen', 'SpringGreen1', 'SpringGreen2', 'SpringGreen3',
          'SpringGreen4', 'steel blue', 'SteelBlue', 'SteelBlue1',
          'SteelBlue2', 'SteelBlue3', 'SteelBlue4', 'tan', 'tan1', 'tan2',
          'tan3', 'tan4', 'teal', 'thistle', 'thistle1', 'thistle2',
          'thistle3', 'thistle4', 'tomato', 'tomato1', 'tomato2', 'tomato3',
          'tomato4', 'turquoise', 'turquoise1', 'turquoise2', 'turquoise3',
          'turquoise4', 'violet', 'violet red', 'VioletRed', 'VioletRed1',
          'VioletRed2', 'VioletRed3', 'VioletRed4', 'wheat', 'wheat1',
          'wheat2', 'wheat3', 'wheat4', 'white', 'white smoke', 'WhiteSmoke',
          'yellow', 'yellow green', 'yellow1', 'yellow2', 'yellow3', 'yellow4',
          'YellowGreen', ]


Sul mio sistema (ubuntu 18.04 - python 3.6.9 con libreria tkinter di default) vengono riconosciuti 758 dei nomi di colore, scartati "agua" e "crymson" ... non saprei dire cosa succede con i sistemi windows, non avendo disponibili macchine con quel s.o.

Qualora un qualche utente con quel sistema sia interessato e volesse dare un feedback in proposito, metto in seguito un prototipo buttato li solo per testare, l'esposizione dei colori al momento, la lista sopra esposta è contenuta in file "lst_nomi.py" importata nel codice di test

# -*- coding : utf-8 -*-

import tkinter as tk
import lst_nomi as lc


class DefColors(tk.Toplevel):
    ''' Finestra dei colori da applicare basata sui color-names di tkinter. '''
    def __init__(self, master=None):
        super().__init__(master)
        self.title('Selezione dei colori')
        # blocco pannello dei colori
        c_colors = tk.Canvas(self, width=150, bg='black')
        c_colors.grid(row=0, column=0, stick='nsew')
        v_scroll = tk.Scrollbar(self)
        v_scroll.grid(row=0, column=1, sticky='ns')
        v_scroll['command'] = c_colors.yview
        c_colors['yscrollcommand'] = v_scroll.set
        right_p = tk.Frame(self, width=100, bg='red')
        right_p.grid(row=0, column=2, sticky='nsew', padx=4, pady=4)
        my_button = tk.Button(self, text='Chiudi finestra', command=self.destroy)
        my_button.grid(row=1, column=0, columnspan=3, sticky='nsew')
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, minsize=150)
        self.grid_columnconfigure(2, weight=1)
        self.minsize(300,300)
        self.maxsize(500,500)
        self.update()
        self.__populate_colors(c_colors)
   
    def __populate_colors(self, pan):
        colors = lc.colors
        print('In lavorazione', str(len(colors)), 'named-colors')
        if not colors:
            return
        row = 0
        posy = 0
        dim_x = pan.winfo_width()
        for color in colors:
            try:
                id = pan.create_rectangle((0, posy, dim_x, posy+15), fill=color)
                posy += 15
                # i bind dopo i test
                row += 1
            except:
                print(row, ' : ', color, '- scartato')
                pass
        pan.configure(scrollregion=(0, 0, dim_x, posy))
        print(str(row), 'colori accettati')
       
# test

if __name__ == '__main__':
    root = tk.Tk()
    w = DefColors(root)
    root.mainloop()
       


3
Tkinter / Re:[Risolto] Elenco nomi dei colori in tkinter
« il: Dicembre 04, 2019, 10:08 »
oh, poi capiamoci... il fatto che tkinter non ritenga necessario esporre questa lista in una api stabile e ragionevole e magari perché no cross-platform (io quel file sul mio windows ovviamente non ce l'ho)...

... beh, non è che serva a molto ma ho i nomi della versione 8.4 di tkinter, nel fine settimana provvederò ad organizzarli in lista ed esporli qui in un post successivo, potrebbe darsi a vengano utili a qualcuno e mi costa poco e, comunque, me li conservo in un modulo di utilità che uso alla bisogna.

vabbè, ma di che stiamo a parlare. Il fatto che si possa pensare di usare tkinter per fare gui app, nel 2019...  :thinking:

Su questo non posso che darTi ragione, a parte qualche occorrenza occasionale (quanto  su serve per completare un discorso iniziato tempo fa) non mi sognerei di usare tkinter per interfacce "complesse", non che sia impossibile ma lo vedo poco "reattivo", anche se molto è dovuto a mia imperizia e scarsa conoscenza.

4
Tkinter / Re:Elenco nomi dei colori in tkinter
« il: Dicembre 04, 2019, 04:56 »
e del resto, questo mi sembra chiaro https://effbot.org/tkinterbook/tkinter-widget-styling.htm#color-names

Si, è chiarissimo, non l'avevo letto, ho cercato nei posti sbagliati,

Quindi, non ti resta che parsare quel file, direi...

Cosa che ho in effetti fatto ... Grazie @RicPol

5
Tkinter / [Risolto] Elenco nomi dei colori in tkinter
« il: Dicembre 03, 2019, 18:28 »
Signori, buona sera

Mi è venuto in mente di fare una dialog di selezione colori in tkinter basata sui nomi dei colori riconosciuti da tkinter e sto facendo qualche esperimento in merito.

La prima prova che mi è venuta in mente, è di popolare la finestra con una serie di label con assegnato il colore tramite il color-name (pessima idea, tempi biblici, troverò qualche altro modo).
Pur avendo trovato i nomi dei colori nella docs in questa pagina, data la pigrizia, ho pensato bene di andarmi a leggeri i nomi dei colori nel file "rgb.txt" di X11, in fondo quei nomi in tkinter si basano su X, applicandoli alle label, ne sono stati riconosciuti 751 su 753, contro i 760 presenti nel documento citato (colori mac e windows esclusi)

Ora, è banale che quei nomi di colore siano memorizzati da qualche parte in tkinter, dato che vengono riconosciuti.
Volendo evitare di scriverli nel codice e/o in un file (che comunque possiedo) ho cercato un metodo od una variabile che li contenga, tanto nella docs quanto leggendo direttamente il sorgente python delle tkinter, non cavandone un ragno dal buco e senza schiarirmi le idee (solo il vago sospetto siano nei binari).

Conoscete un metodo per "estrarre" l'elenco dei nomi di colore o, almeno, come stanno le cose?

Grazie dell'attenzione, ciao.

6
Ciao @Steve

Di per se, i passi necessari al Tuo quesito sono semplici, provo a mostrarteli passo passo :

supponiamo definiti i nostri file di input e di output
Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> f_input = 'file.txt'
>>> f_output = 'file_2.txt'

In cui il file di input contiene esattamente il testo da Te esemplificato. potrai leggerne il contenuto ed assegnarne le singole righe ad una lista di stringhe in questo modo:
>>> fi = open(f_input, 'r')
>>> righe = fi.read().splitlines()
>>> righe
['italia.rar', 'italia.rev', 'italia2.rar', 'italia2.rev']
>>> fi.close()

Per i metodi utilizzati, vedi la docs.
Tieni presente che è bene chiudere i file non appena concluse le operazioni di input/output necessarie e che un approccio più corretto prevederebbe l'intercettazione di eventuali errori, ma per ora è prematuro parlarne.

Una volta ottenuta la lista delle righe contenute nel file di input, esistono molti modi per vedere se una determinata stringa è contenuta in un'altra, si va dal metodo "find()" (leggi la docs) delle stringhe alle espressioni regolari, dipende "dalle circostanze".
Un modo molto semplice applicabile al Tuo esempio è vedere direttamente sel la parte da cercare ".rev" è contenuta in una determinata riga, esempio :
>>> for riga in righe:
if '.rev' in riga:
print(riga)



italia.rev
italia2.rev


Puoi, quindi, aprire il file di destinazione e scriverci le righe che NON contengono tale stringa in questo modo :
>>> fo = open(f_output, 'w')
>>> for riga in righe:
if not '.rev' in riga:
fo.write(riga + '\n')


11
12
>>> fo.close()

Trova e leggi la docs relativa.
Il file conterrà :
NzP:~$ cat file_2.txt
italia.rar
italia2.rar
NzP:~$


Spero Ti sia sufficiente, ciao :)

7
Tkinter / Re:visualizzare dati intabellati
« il: Novembre 29, 2019, 18:22 »
Riletto, e cercato di meditare, sul post di @RicPol ... mi rendo conto di aver fatto un "qualcosa" di quelle che fanno andare il latte alle ginocchia agli esperti, me ne dolgo

Ma una cosa più istruttiva da notare è che il Model si esprime "convenientemente" nello stesso linguaggio della View... se guardi alla riga 85-85, vedrai che la View si limita a ricevere i valori del Model tali e quali. Ma questo vuol dire che Model e View sono interdipendenti ("accoppiati", "coupled" come si dice in gergo OOP). In realtà il Model dovrebbe esprimersi in un modo più astratto, e lasciare alla View il compito ...

In effetti la classe TableModel da me definita è pensata proprio quale ambito di definizione di alcune caratteristiche della visualizzazione di cui deve tenere la "tabella", i dati, nel caso, sono solo un elemento di comodo esemplificativo. La immaginavo destinataria anche di ulteriori caratteristiche, tipo colrazione alternata delle righe, colori di background e foreground, fonts, etc.

Che la sua "denominazione" potesse individuarla quale elemento di un contesto MCV non mi aveva sfiorato neppure vagamente.

Ciò nulla toglie al valore delle critiche ed indicazioni espresse, mi riservo, ammesso riesca a comprendere l'argomento, di tentare una futura implementazione secondo il paradigma MCV.

Grazie delle osservazioni.

8
Tkinter / Re:visualizzare dati intabellati
« il: Novembre 29, 2019, 16:33 »
Ciao @RicPol

Purtroppo non è così semplice. ...

Intervento molto interessante, sei da leggere :)

comunque,  riguardo
(E no, giusto per prevenire la solita obiezione: non è che "è solo uno schizzo", è proprio una questione delle fondamenta ...

Non avevo intenzione di toccare alcuna fondamenta (MCV? Quale arcano esotismo per me!), solo dare un esempio di "assemblaggio" buttato li. Per il resto, nessuna pretesa.

Spero continuamente in interventi di qualità come il Tuo in questo post, a me danno almeno idea su ciò che ignoro, se il discorso continuerà a svilupparsi leggerò con interesse.

Ciao :)

9
Tkinter / Re:visualizzare dati intabellati
« il: Novembre 29, 2019, 15:48 »
Ti ringrazio per il codice, in effetti la mia richiesta è solo per studio, sono interessato a python e a quelle applicazioni che servono a registrare dati, editarli o cancellarli, quelli che ingergo vengono chiamati CRUD. ...

Nei prossimi giorni o meglio nel fine settimana ci giocherò un pò e ti faccio sapere.

Capisco, personalmente preferisco operare in LAN locale e su PostgreSQL, ma anche a me piace adoperare la visualizzazione tabellare, prevalentemente per la consultazzione/selezione tra i records da manipolare.

In merito al mio precedente post, ho riscontrato che viene meglio non mischiare label ed entry, una resa migliore si ottiene con le entry anche per le intestazioni di colonna, ovviamente poste in sola lettura. Considera questa modifica nrò popolare le etichette, imho la resa visiva è migliore.


    def __populate(self):
        ''' Popola la tabella con i dati memorizzati nel modello. '''
        # etichette
        self.labels = []
        h_bg = tk.Frame(self)
        h_bg.grid(row=0, column=0, sticky='ew', padx=0, pady=0)
        for i in range(len(self.model.headers)):
            lbl = tk.Entry(h_bg, justify='center', bg='gray91')
            lbl.configure(relief='raised')
            lbl.insert(tk.END, self.model.headers[i])
            lbl.configure(state='readonly')
            lbl.grid(row=0, column=i, sticky='ew')
            self.labels.append(lbl)


Ciao

10
Tkinter / Re:visualizzare dati intabellati
« il: Novembre 29, 2019, 13:00 »
Vorrei creare una tabella dove visualizzo dei dati provenienti da un db MySql.
Il collegamento e la lettura dei dati da db è andata a buonfine, ma adesso vorrei intabellarli e visualizzarli dentro una finestra di tkinter...

Ciao @Giuse

La rappresentazione "tabellare" dei dati è un "qualcosa" che ho cercato a mia volta in tkinter : mi sembra proprio che non ci sia.

In ogni caso, non è poi troppo difficile realizzarne una, più o meno complessa, sfruttando il gestore di geometria "grid", giusto per giocarci un po' ieri sera mi son divertito a realizzare un esempio minimale che Ti propongo come spunto

# -*- coding: utf-8 -*-

import tkinter as tk

class TableModel():
    '''
Modello base per contenimento dati, intestazioni e dimensionamento per
un oggetto "Table".
'''
   
    def __init__(self, geometry=None, headers=None, data=None):
        '''
"Costruttore" del modello di tabella.

Parametri :
    geometry - dizionario contenente le chiavi :
                minsizes : lista di interi, dimensioni minime delle colonne
                weights : lista di interi definente il proporzionamento al
                           resize, 0 = colonna fissa
    headers  - lista intestazioni delle colonne
    data     . lista di liste : valori nelle colonne

Note : mi piacerebbe aggiungere un "maxsize" alle colonne ma non mi sembra supportato

'''
        self.geometry = geometry
        self.headers = headers
        self.data = data

       
class Table(tk.Frame):
    '''
Elementare "Tabella" dati, crea una singola riga di etichette di intestazione
ed n righe di entry per i dati.
'''
    def __init__(self, master=None, model=None):
        '''
"Costruttore" della tabella

parametri :
    master : widget/finestra proprietaria
    model  : modello della tabella
'''
        super().__init__(master)
        # verifica il modello di tabella, se incoerente si auto-distrugge
        if not model.geometry or not model.headers:
            self.destroy()
            return
        self.model = model
        self.__populate()

    def __populate(self):
        ''' Popola la tabella con i dati memorizzati nel modello. '''
        # etichette
        self.labels = []
        h_bg = tk.Frame(self)
        h_bg.grid(row=0, column=0, sticky='ew', padx=0, pady=0)
        for i in range(len(self.model.headers)):
            lbl = tk.Label(h_bg)
            lbl.configure(text=self.model.headers[i], relief='raised')
            lbl.grid(row=0, column=i, sticky='ew')
            self.labels.append(lbl)
        # definizione sfondo delle celle dati
        cells_bg = tk.Frame(self)
        cells_bg.grid(row=1, column=0, sticky='nsew', padx=0, pady=0)
        # definizione delle celle dati
        self.cells = []
        for i in range(len(self.model.data)):
            row_cells = []
            for j in range(len(self.model.headers)):
                c = tk.Entry(cells_bg, relief='ridge', bg='white')
                c.grid(row=i, column=j, sticky='ew')
                c.insert(tk.END, self.model.data[i][j])
                c.bind('<FocusIn>', self.__cell_focus)
                row_cells.append(c)
            self.cells.append(row_cells)
        # scroolbar ... poi

        # proporzionamento colonne
        for i in range(len(self.model.geometry['minsizes'])):
            if self.model.geometry['minsizes'][i]:
                h_bg.grid_columnconfigure(i, minsize=self.model.geometry['minsizes'][i])
                cells_bg.grid_columnconfigure(i, minsize=self.model.geometry['minsizes'][i])
            if self.model.geometry['weights'][i]:
                h_bg.grid_columnconfigure(i, weight=self.model.geometry['weights'][i])
                cells_bg.grid_columnconfigure(i, weight=self.model.geometry['weights'][i])
        # definizione del "peso" di riga/colonna
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(1, weight=1)
        # definizione riga corrente
        self.__curr_row = 0

    def __cell_focus(self, evt):
        row = evt.widget.grid_info()['row']
        if row != self.__curr_row:
            # "decolora" la vecchia riga selezionata
            for c in self.cells[self.__curr_row]:
                c.configure(bg='white')
            self.__curr_row = row
            # "colora" la nuova riga selezionata
            for c in self.cells[self.__curr_row]:
                c.configure(bg='#ffffc0')
           

# un primo test "al volo"
if __name__ == '__main__':
    # preparo le impostazioni per il "modello"
    g = {'minsizes' : [0, 0, 0],
         'weights'  : [1, 1, 1]
         }
    h = ['Cognome', 'Nome', 'data nascita']
    data = [['De Paperoni', 'Paperon', '1901-01-01'],
            ['Paperino', 'Paolino', '1950-11-01'],
            ['Paperone', 'Gastone', '1950-01-06'],
            ['Mouse', 'Miky', '1900-02-29'],
            ['Mouse', 'Minnie', '1910-01-01'],
            ['Mucca', 'Clarabella', '1923-12-13']
            ]
    model = TableModel(g, h, data)
    app = tk.Tk()
    f = tk.Frame(app)
    f.grid(row=0, column=0, sticky='nsew')
    t = Table(f, model)
    t.grid(row=0, column=0, sticky='nsew')
    b = tk.Button(f, text='Chiudi', command=app.destroy)
    b.grid(row=1, column=0, sticky='ew')
    f.grid_columnconfigure(0, weight=1)
    f.grid_rowconfigure(0, weight=1)
    app.grid_columnconfigure(0, weight=1)
    app.grid_rowconfigure(0, weight=1)
    app.mainloop()

Non è molto curato, ma testato poco fa sembra andare benino, per lo meno non da errori ed "evidenzia" la riga selezionata.

Ho ipotizzato un "modello di tabella" per una ipotesi di sviluppo futuro di caratteristiche del giocattolo. Rendere qualcosa di migliore motrebbe essere un interessante esercizio di studio per apprendisti tipo me e, suppongo, altri in circolazione eventualmente interessati.

Ciao :)

11
Si scherza, figurati...

L'avevo capito :)

Per le Tue considerazioni, comprendo e non posso che offrirTi la mia solidarietà, con molta "leggerezza" l'utenza prende ciò che trova senza la minima considerazione di quanto prezioso, laborioso e faticoso sia l'impegno profuso per creare ciò che è a nostra disposizione.

Sin troppo familiare è tale leggerezza, negli oltre trent'anni che frequento questo "mondo" (continente FLOSS in particolare) l'ho vista crescere di pari passo al suo divenire "amichevole" nei confronti dell'utenza ... temo sia un fattore "generazionale", troppa abitudine ad avere disponibili mezzi sofisticati ed informazioni hanno portato a non comprendere il valore che tali mezzi hanno, oltre che al non saperne discernere la qualità degli stessi.

... però, una considerazione la voglio fare : pur se non mancano "approfittatori" maturi e con disponibilità, la maggior parte degli "interessati" a tali argomenti sono giovani ed il nostro "sociale" è diventato ostile ad essi, ne conosco molti che devono centellinarsi i centesimi ed anche pochi euro possono essere, per loro, significativi.

Non voglio, con ciò, giustificare il "braccino stretto", solo esprimere il concetto che non necessariamente al "minimo" corrisponda un mancato apprezzamento del Tuo lavoro.

12
Si, è un work-in-progress e fornisce alcuni stralci perché lo si possa valutare.

Ho avuto modo di leggere gli appunti che lo hanno originato e, personalmente, ne sono rimasto colpito favorevolmente, per quanto ho visto in giro è uno dei pochi documenti decenti in italiano circa la definizione di interfacce grafiche in applicazioni python.
però comprare il libro no, eh? grrrrr   :devil:

 :glasses-cool:  è preventivato tra le spese da fare! Dai tempo al tempo! :)

Due "difficoltà" :
1° - Non ho "strumenti" per fare transazioni on-line, mai fatte, x sfiducia innanzi tutto, ma prima o poi mio figlio tornerà dall'Università.
2° - dopo un primo approccio, ho appeso le GUI al chiodo, per "stagionare" adeguatamente le basi pythoniche, ho "qualcosa" ancora da vedere ... ma mi ci sto avvicinando.

13
Si, è un work-in-progress e fornisce alcuni stralci perché lo si possa valutare.

Ho avuto modo di leggere gli appunti che lo hanno originato e, personalmente, ne sono rimasto colpito favorevolmente, per quanto ho visto in giro è uno dei pochi documenti decenti in italiano circa la definizione di interfacce grafiche in applicazioni python.

14
Mi scuso se mi permetto di intervenire nel post, pur avendo molto da imparare

...
Mi chiedevo se fosse possibile combinarli tra loro: dentro una finestra ho 2 zone/frame che potrei definire con place, mentre dentro questi 2 potrei usare grid?

Si è possibile se occorre, in proposito mi permetto di proporti un esempio che tempo fa mi misi a sviluppare per un utente in un altro forum, interrotto, in cui, nelle finestre di test, utilizzo e mischio i gestori di layout grid e pack.

Bada bene, in caso di uso del gestore "place", che eventuali ridimensionamenti della finestra devi gestirli direttamente dal Tuo codice ... in ogni caso, personalmente, non considero una buona idea combinare gestori di geometria che utilizzano diverse "regole", potendo verificarsi comportamenti imprevisti.

Per finire, la Tua domanda iniziale : se sei sufficiente anglofono, niente da aggiungere ma, se come me hai difficoltà con l'inglese, considera di dare una guardata al libro del buon @Ric, credo ne valga la pena e che le wx non siano malvagge.

15
Esercizi / Re:Aiuto Esercizi
« il: Novembre 18, 2019, 20:00 »
Salve, ho da poco iniziato ad usare python ed ho già molti problemi  :(, spero che possiate aiutarmi a risolvere questi esercizi:
...

"Aiutarti" vorrebbe significare?

Se intendi fare l'esercizio per Te, non sarebbe certo aiutarti, bensì ostacolarti, qualora, invece, significhi "datemi una mano", d'accordo : quale codice hai scritto sin ora? quali problemi che hai riscontrato?

Quando proprio Tu non sappia come iniziare :
per definire una funzione : guarda qui
per ottenere un input da tastiera : guarda qui
poi leggi qualcosa riguardo alle stringhe, p.e. da qui, e quindi poniti la domanda : cosa hanno fi particolare i numeri binari? (forse che sono una successione di 0 ed 1?), cerca come fare una verifica "carattere per carattere" e quindi, usa le regole di conversione numerica da base 2 a base 10, di certo l'hai su qualche libro, comunque c'è wikipedia

per quanto riguarda il 2° esercizio : leggi la documentazione del metodo split() delle stringhe e della funzione bultin len(), son certo che se Ti fermi un attimo a pensarci su la soluzione viene da sola.

Provaci a risolvere gli esercizi e, se proprio non Ti riesce, posta il codice che sei riuscito a produrre che ne si parla.

Ciao :)

Pagine: [1] 2 3 ... 8