Strona główna Polish Python Coders Group
   Strona główna   Pomoc Zaloguj się Rejestracja  
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Aktualności: PyStok #42 - wystąpią Łukasz Langa i Dominik Kozaczko
Szukaj Szukaj
Strony: [1]   Do dołu
Drukuj
Wątek: część wspólna dwóch list  (Przeczytany 5498 razy)
« : 21:11 15/04/17 »
guest013 Offline
Advanced Python User

Zobacz profil
**

Reputacja: 21
Wiadomości: 156


Hej,

list_1 jest to lista stała nie zmieniająca swych wartości
list_2 ta lista jest za każdym razem generowana inna

w poniższym okienku wyświetla się list_1 a docelowo te elementy które są wspólne dla obu list miałyby być czerwone

Kod
import tkinter as tk
from tkinter import Label
from random import randint
 
 
list_1 = [2, 5, 8, 9, 14, 26, 28, 34, 43, 51, 55, 60, 77]
list_2 = [randint(1, 100) for i in range(12)]
 
 
root = tk.Tk()
 
label = tk.Label(root).grid(row=0) # free space
label2 = tk.Label(root, text=list_1, padx=15)
label2.grid(row=1)
label = tk.Label(root).grid(row=2) # free space
 
root.mainloop()

Próbowałem, kombinowałem jak poniżej, ale wciąż nie wychodzi

Kod
if list_2 in list_1:
   label2.config(fg='red')

Kod
for i in list_1:
   for i in list_2:
       label2.config(fg='red')

W czym tkwi błąd?

Zapisane

Expect nothing and you will never be dissapointed
« Odpowiedz #1 : 22:55 15/04/17 »
gadacz Offline
Advanced Python User

Zobacz profil
**

Reputacja: 9
Płeć: Mężczyzna
Wiadomości: 135


Specjalistą od tkintera nie jestem, ale mogę coś podpowiedzieć,
otóż Label nie da się łączyć z kilkoma różnymi właściwościami tekstu.

Ale już Text da się.

Wyrzeźbiłem takie coś, ale jest problem z posortowaniem tego Mrugnięcie
Ale jakąś podstawę do dalszej walki masz.

Kod
import tkinter as tk
from tkinter import Text
from random import randint
 
list_1 = [2, 5, 8, 9, 14, 26, 28, 34, 43, 51, 55, 60, 77]
list_2 = [randint(1, 100) for i in range(12)]
 
root = tk.Tk()
 
temp_list = set(list_1).intersection(list_2)
common_nums = []
 
 
for i in temp_list:
   if i in list_1:
       list_1.remove(i)
       common_nums.append(i)
 
 
text = Text(root)
 
 
text.pack()
text.insert('insert', list_1)
text.insert('insert', common_nums, 'RED')
text.tag_config('RED', foreground='red')
 
root.mainloop()
 
Zapisane

--
pozdrawiam
gadacz
« Odpowiedz #2 : 13:04 16/04/17 »
raydeal Offline
Expert Python User

Zobacz profil
****

Reputacja: 86
Wiadomości: 506


label2 jest cala etykietą która zawiela elementy list_1 jako text. Nie możesz zmienić koloru dla pojedynczych znaków, możesz ustawić kolor tekstu dla całej etykiety podczas jej tworzenia.
Jeśli zrobisz
Kod
label2 = tk.Label(root, text=list_1, padx=15, fg='blue')
#albo
label2.config(fg = 'blue')
to będziesz miał niebieski tekst. Jeśli chcesz to zrobić na etykietach to dla każdego elementu list_1 musisz utworzyć nową etykietę ustawiając jej odpowiedni kolor tekstu.

Jeśli ma to być w jednej etykiecie to może źle porównujesz listy i program nie dochodzi do instrukcji zmieniającej kolor.
Zapisane
« Odpowiedz #3 : 13:33 16/04/17 »
guest013 Offline
Advanced Python User

Zobacz profil
**

Reputacja: 21
Wiadomości: 156


label2 jest cala etykietą która zawiela elementy list_1 jako text. Nie możesz zmienić koloru dla pojedynczych znaków

Rzeczywiście, całkowicie wyleciało mi to z głowy. Powalczę teraz z pomysłem pycodera Uśmiech
Zapisane

Expect nothing and you will never be dissapointed
« Odpowiedz #4 : 19:51 16/04/17 »
gadacz Offline
Advanced Python User

Zobacz profil
**

Reputacja: 9
Płeć: Mężczyzna
Wiadomości: 135


Zerknij na wersję z Labelem Mrugnięcie w ramach relaksu przy piwku Mrugnięcie
Kod
import tkinter as tk
from random import randint
 
list_1 = [2, 5, 8, 9, 14, 26, 28, 34, 43, 51, 55, 60, 77]
list_2 = [randint(1, 100) for i in range(12)]
 
root = tk.Tk()
 
common_nums = set(list_1).intersection(list_2)
 
for i in list_1:
   label = tk.Label(root, text=i)
   if i in common_nums:
       # print(i)
       label.config(fg='red')
   label.pack(side=tk.LEFT)
 
root.mainloop()
 
Zapisane

--
pozdrawiam
gadacz
« Odpowiedz #5 : 21:09 16/04/17 »
guest013 Offline
Advanced Python User

Zobacz profil
**

Reputacja: 21
Wiadomości: 156


Dokładnie o takie coś mi chodziło Uśmiech Widzę, że daleko mi do takich rozwiązań

P.S.
Ja się relaksowałem z piwkiem ale bez Pythona Mrugnięcie
Zapisane

Expect nothing and you will never be dissapointed
« Odpowiedz #6 : 21:37 16/04/17 »
gadacz Offline
Advanced Python User

Zobacz profil
**

Reputacja: 9
Płeć: Mężczyzna
Wiadomości: 135


Nie przesadzaj Mrugnięcie

Ja to amatorszczyzna weekendowa jestem jeśli chodzi o programowanie Mrugnięcie
a Tkintera widziałem ze 2x i wolę Qt.

To na pewno przez ten browar Chichot
Zapisane

--
pozdrawiam
gadacz
« Odpowiedz #7 : 03:25 17/04/17 »
Guaz Offline
Expert Python User

Zobacz profil
****

Reputacja: 72
Płeć: Mężczyzna
Wiadomości: 544


W sumie rozwiązanie dobre pycoder_pl bo działa Chichot. Tylko tworzy się zawsze 12-ście etykiet. Nie wiem jak to wygląda jeśli chodzi o optymalność, ale ja bym się pobawił w ten sposób:
Kod
import tkinter as tk
from random import randint
 
list_1 = [2, 5, 8, 9, 14, 26, 28, 34, 43, 51, 55, 60, 77]
list_2 = [randint(1, 100) for i in range(12)]
 
root = tk.Tk()
 
common_nums = set(list_1).intersection(list_2)
i2=''
 
for i in list_1:
   if i in common_nums:
       label2 = tk.Label(root, text=i2)
       label2.pack(side=tk.LEFT)
       i2=''
       label = tk.Label(root, text=i)
       label.config(fg='red')
       label.pack(side=tk.LEFT)
   else:
       i2+=str(i)+' '
 
if i2!='':
   label2 = tk.Label(root, text=i2)
   label2.pack(side=tk.LEFT)
   del i2
 
 
root.mainloop()
 
Kod faktycznie dłuższy, nie wiem czy bardziej, czy mniej optymalny, ale robi mniej etykiet. Zależy co chcemy uzyskać Uśmiech. W końcu w programowaniu sposobów na to samo są tysiące ;d

@Edit:
W sumie to nie pomyślałem, bo przecież w ten sposób gdy jest więcej elementów jest wspólnych, tym więcej etykiet robi, nawet jak będą w ciągu. może przy 12-stu to niewielka różnica, ale jeśli przy dłuższych miałoby mieć znaczenie, to:
Kod
import tkinter as tk
from random import randint
 
list_1 = [2, 5, 8, 9, 14, 26, 28, 34, 43, 51, 55, 60, 77]
list_2 = [randint(1, 100) for i in range(12)]
 
root = tk.Tk()
 
common_nums = set(list_1).intersection(list_2)
i1=''
i2=''
 
 
for i in list_1:
   if i in common_nums:
       if i2!='':
           label = tk.Label(root, text=i2)
           label.pack(side=tk.LEFT)
       i2=''
       i1+=str(i)+' '
   else:
       if i1!='':
           label = tk.Label(root, text=i1)
           label.config(fg='red')
           label.pack(side=tk.LEFT)
       i1=''
       i2+=str(i)+' '
 
if i2.strip()!='':
   label = tk.Label(root, text=i2)
   label.pack(side=tk.LEFT)
   del i2
 
if i1.strip()!='':
   label = tk.Label(root, text=i1)
   label.pack(side=tk.LEFT)
   del i1
 
 
root.mainloop()
 
Wydaje mi się że mogłoby mieć gdybyś chciał dodać jakieś obramowanie ciągów czerwonych i czarnych odgradzając od siebie dla widoczności. Ale to wszystko zależy od zastosowania Uśmiech. Równie dobrze mogłem zrobić badziew z kodu ;P
(Wybacz ciekawość, ale szukanie prawdopodobieństwa do lotto czy gier tego typu ;P? Bo wiem że z takimi pierdołami się niektórzy bawią ;d)

@Edit2:
Czas wykonania bardzo zbliżony, minimalnie mniejszy, im więcej elementów w liście tym lepiej sobie radzi mój, tyle że jest dłuższy i zajmuje prawie trzykrotnie więcej miejsca. Więc pycoder_pl wydaje mi się że podał dużo lepsze rozwiązanie Język.
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
« Odpowiedz #8 : 15:04 17/04/17 »
guest013 Offline
Advanced Python User

Zobacz profil
**

Reputacja: 21
Wiadomości: 156


Wybacz ciekawość, ale szukanie prawdopodobieństwa do lotto czy gier tego typu ;P?

W pewnym sensie trafiłeś. W wolnej chwili tak dla oderwania od mojego projektu postanowiłem napisać mały programik mojej teściowej. Pokombinowałem i go stworzyłem Uśmiech Nic specjalnego, ot zwykłe 'pociągnięcie' wyników multi multi z ostatnich dwóch losowań. W pierwszej wersji moje okienko miało jeden przycisk, który po wciśnięciu uruchamiał przeglądarkę ze stroną z wynikami. Później postanowiłem ją ulepszyć do obecnej postaci bo teraz wyniki ma bezpośrednio w aplikacji. I pomimo działającego kodu zachciałem dalej w nim mieszać i wymyśliłem oznaczanie czerwonym kolorem pewnych numerów. Otóż moja teściowa gra tylko określoną ilością liczb i dałoby się to ogarnąć ale jak pokazuje ten post utknąłem Uśmiech

Poniżej to co stworzyłem do tej pory, widać tam Labelki i stąd pomysł kolorowania liczb bezpośrednio w nich. Póki co jeszcze nie opracowałem lepszej wersji ale na pewno dam radę. Poza tym zainteresowałem się setami (nie mylić z tenisem i/lub z piciem Mrugnięcie ) Wpisałem w kod złote numery ale ich jeszcze do niczego nie użyłem.

Kod
import requests
import tkinter as tk
from tkinter import Label
 
font = 'Verdana 16'
 
goldeNums = [22, 33, 34, 37, 41, 43, 46, 47, 51, 54, 57, 60]
 
wyniki14 = (requests.get('http://app.lotto.pl/wyniki/?type=mm14').text).split()
wyniki22 = (requests.get('http://app.lotto.pl/wyniki/?type=mm22').text).split()
 
dat_g14 = wyniki14[0] + ('  14:00')
wyniki14 = sorted([int(i) for i in wyniki14[1:]])
 
dat_g22 = wyniki22[0] + ('  21:40')
wyniki22 = sorted([int(i) for i in wyniki22[1:]])
 
root = tk.Tk()
root.title("Multi v2.0")
root.geometry("510x150+250+150")
 
label = tk.Label(root).grid(row=0) # free space
label = tk.Label(root, text=dat_g14, font=font, anchor='center').grid(row=1)
label = tk.Label(root, text=wyniki14, font=font, padx=10, anchor='center').grid(row=2)
label = tk.Label(root, text='--------------------------------------------').grid(row=3)
label = tk.Label(root, text=dat_g22, font=font, anchor='center').grid(row=4)
label = tk.Label(root, text=wyniki22, font=font, padx=10, anchor='center').grid(row=5)
label = tk.Label(root).grid(row=6) # free space
 
root.mainloop()







Zapisane

Expect nothing and you will never be dissapointed
« Odpowiedz #9 : 21:50 19/04/17 »
Guaz Offline
Expert Python User

Zobacz profil
****

Reputacja: 72
Płeć: Mężczyzna
Wiadomości: 544


Miałem trochę innej pracy, ale mam czas na relaks przy twoim problemie, więc:

Rozumiem, przedewszystkim należałoby zrobić frame'a na roota aby go przekazać do funkcji. Uśmiech
Następnie metodykę która podkreśla na czerwono cyfry należałoby wrzucić w funkcje której przekażesz dwie listy i frame'a.

Ponadto ograniczyłbym długość linii oraz podzielił na funkcje aby program był czytelniejszy Chichot.

No i w sumie stwierdziłem odkąd pisałem powyższe że przedstawię ci przykład Uśmiech.
Jedyne czego nie zrobiłem, to nie uporządkowałem linii, możesz się pobawić ze zmianą na coś innego spowrotem, to powinno załatwić sprawę, tyle że numer row'a musisz też wprowadzić do funkcji aby móc jedną funkcję zastosować do obu linii.
No i poza tym, to trochę bardziej na swój styl zmieniłem kod, więc sobie powinieneś go dostosować pod siebie. Przy okazji jeśli będzie coś niezrozumiałe, może sam dojdziesz dlaczego tak a nie inaczej, w innym wypadku pytaj, przyda ci się to do ewentualnych modyfikacji Uśmiech.
Kod
import requests
from tkinter import *
 
def main():
   d_font = 'Verdana 14'
 
   goldeNums = [22, 33, 34, 37, 41, 43, 46, 47, 51, 54, 57, 60]
 
   wyniki14 = (requests.get('http://app.lotto.pl/wyniki/?type=mm14').text).split()
   wyniki22 = (requests.get('http://app.lotto.pl/wyniki/?type=mm22').text).split()
 
   dat_g14 = wyniki14[0] + ('  14:00')
   wyniki14 = sorted([int(i) for i in wyniki14[1:]])
 
   dat_g22 = wyniki22[0] + ('  21:40')
   wyniki22 = sorted([int(i) for i in wyniki22[1:]])
 
   root = Tk()
   root.title("Multi v2.0")
   #default_font.configure(size=14)
   root.option_add("*Font", d_font)
   in_frame = Frame(root)
 
   label = Label(in_frame) # free space
   label.pack(side=TOP, fill=X)
 
   label = Label(in_frame, text=dat_g14, anchor='center')
   label.pack(side=TOP, fill=X)
 
   create_multicolor_label(wyniki14, goldeNums, in_frame)
 
   label = Label(in_frame, text='-'*64)
   label.pack(side=TOP, fill=X)
 
   label = Label(in_frame, text=dat_g22, anchor='center')
   label.pack(side=TOP, fill=X)
 
   create_multicolor_label(wyniki22, goldeNums, in_frame)
 
   label = Label(in_frame) # free space
   label.pack(side=TOP, fill=X)
 
   in_frame.pack()
 
   root.mainloop()
 
 
def create_multicolor_label(list_1, list_2, in_frame):
   common_nums = set(list_1).intersection(list_2)
   i1=''
   i2=''
 
   for i in list_1:
       if i in common_nums:
           if i2!='':
               label = Label(in_frame, text=i2)
               label.pack(side=LEFT, fill=X)
           i2=''
           i1+=str(i)+' '
       else:
           if i1!='':
               label = Label(in_frame, text=i1)
               label.config(fg='red')
               label.pack(side=LEFT, fill=X)
           i1=''
           i2+=str(i)+' '
 
   if i2.strip()!='':
       label = Label(in_frame, text=i2)
       label.pack(side=LEFT, fill=X)
       del i2
 
   if i1.strip()!='':
       label = Label(in_frame, text=i1)
       label.pack(side=LEFT, fill=X)
       del i1
 
if __name__=="__main__":
   main()
#Albo zwykłe main()
 
Jak odpalisz to będzie oczywiście rozjechane jak nadmieniłem Język.
Gdybyś sobie nie radził z przerobieniem aby się nie rozjechało, to postaram się jakoś pomóc.
Póki co daję ci możliwość dalszej zabawy ^^
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
« Odpowiedz #10 : 23:21 19/04/17 »
guest013 Offline
Advanced Python User

Zobacz profil
**

Reputacja: 21
Wiadomości: 156


Rzeczywiście rozjechane ale .. działa Uśmiech Świetna robota. Teraz ja muszę znaleźć czas na 'relaks' ale chyba wiem gdzie leży problem. W def(main) pack układa się side=TOP, a poniżej w kolorowaniu pack jest side=LEFT. Musiałbym siąść do kompa żeby to sprawdzić, bo piszę z telefonu Uśmiech
Zapisane

Expect nothing and you will never be dissapointed
« Odpowiedz #11 : 09:25 20/04/17 »
Guaz Offline
Expert Python User

Zobacz profil
****

Reputacja: 72
Płeć: Mężczyzna
Wiadomości: 544


W sumie to i tak mi się nie chciało wracać do mojej roboty, więc trochę rozwinąłem program, o możliwość modyfikacji liczb, oraz domyślnie są ustawione te które chciałeś ;P.
Oraz moduł który odświeża co sekundę sprawdzając numery, na twoim miejscu jeszcze bym zoptymalizował warunek aby się zmieniał tylko wtedy kiedy zmienisz golde_nums Uśmiech

Rozwiązaniem była kombinacja grid'a i pack'a w oddzielnych frame'ach ;p.

Jak powyżej, jeśli coś będzie niezrozumiałe, pytaj śmiało Uśmiech
Kod
import requests
from tkinter import *
 
def main():
 
 
   wyniki14 = (requests.get('http://app.lotto.pl/wyniki/?type=mm14').text).split()
   wyniki22 = (requests.get('http://app.lotto.pl/wyniki/?type=mm22').text).split()
 
   dat_g14 = wyniki14[0] + ('  14:00')
   wyniki14 = sorted([int(i) for i in wyniki14[1:]])
 
   dat_g22 = wyniki22[0] + ('  21:40')
   wyniki22 = sorted([int(i) for i in wyniki22[1:]])
 
   root = Tk()
   root.title("Multi v3.0")
   root.geometry("650x200")
   d_font = 'Verdana 14'
   header_font = 'Verdana 12'
   root.option_add("*Font", d_font)
   in_frame = Frame(root)
   header = Frame(root)
 
   #header frame
   label = Label(header, font=header_font, text="Wprowadź do porównania: ")
   label.pack(side=LEFT)
 
   golde_nums = StringVar()
   golde_nums.set('22, 33, 34, 37, 41, 43, 46, 47, 51, 54, 57, 60')
   entry = Entry(header, textvariable=golde_nums, font=header_font)
   entry.pack(expand=True, side=RIGHT, fill=X)
 
   #in_frame labels
   label = Label(in_frame) # free space
   label.grid(row=1)
 
   label = Label(in_frame, text=dat_g14, anchor='center')
   label.grid(row=2)
 
   create_multicolor_label(wyniki14, golde_nums.get().split(', '), in_frame, 3)
 
   label = Label(in_frame, text='-'*64)
   label.grid(row=4)
 
   label = Label(in_frame, text=dat_g22, anchor='center')
   label.grid(row=5)
 
   create_multicolor_label(wyniki22, golde_nums.get().split(', '), in_frame, 6)
 
   label = Label(in_frame) # free space
   label.grid(row=7)
 
   header.pack(side=TOP, fill=X)
   in_frame.pack()
 
   def update():
       create_multicolor_label(wyniki14, golde_nums.get().split(', '), in_frame, 3)
       create_multicolor_label(wyniki22, golde_nums.get().split(', '), in_frame, 6)
       root.after(1500, update)
 
   root.bind("<Escape>", lambda escape: root.destroy())
   root.after(1500, update)
   root.mainloop()
 
 
def create_multicolor_label(list_1, list_2, in_frame,x):
   try:
       for i in range(len(list_2)):
           list_2[i]=int(list_2[i])
   except:
       return 0
   common_nums = set(list_1).intersection(list_2)
   i1=''
   i2=''
   selected = Frame(in_frame)
 
   for i in list_1:
       if i in common_nums:
           if i2!='':
               label = Label(selected, text=i2)
               label.pack(side=LEFT, fill=X)
           i2=''
           i1+=str(i)+' '
       else:
           if i1!='':
               label = Label(selected, text=i1)
               label.config(fg='red')
               label.pack(side=LEFT, fill=X)
           i1=''
           i2+=str(i)+' '
 
   if i2.strip()!='':
       label = Label(selected, text=i2)
       label.pack(side=LEFT, fill=X)
       del i2
 
   if i1.strip()!='':
       label = Label(selected, text=i1)
       label.pack(side=LEFT, fill=X)
       del i1
 
   selected.grid(row=x)
 
if __name__=="__main__":
   main()
#Albo zwykłe main()
 
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
« Odpowiedz #12 : 11:54 20/04/17 »
guest013 Offline
Advanced Python User

Zobacz profil
**

Reputacja: 21
Wiadomości: 156


Powiem Ci tak: Świetna robota. Dobrze że działa, i że się da stosować dla każdego chętnego Uśmiech Sam kod jest super, chociaż wszystkiego nie rozumiem. Najgorzej ze zrozumieniem defa create_multicolor_label. To jeszcze nie mój poziom. Muszę więcej potrenować Mrugnięcie
Zapisane

Expect nothing and you will never be dissapointed
« Odpowiedz #13 : 16:12 20/04/17 »
Guaz Offline
Expert Python User

Zobacz profil
****

Reputacja: 72
Płeć: Mężczyzna
Wiadomości: 544


To elementarny błąd, ale nie ma się co przejmować  Duży uśmiech

https://www.youtube.com/watch?v=ybRVhUtdHs8&index=13&list=PLdBHMlEKo8UcOaykMssI1_X6ui0tzTNoH
Polecam ci ten filmik na dobry wstęp.

A skrótowo i bardzo podstawowo wygląda to w ten sposób:
>> Definiujesz funkcje której podajesz kilka zmiennych jako argumenty, one lokalnie wewnątrz funkcji będą nazwane w sposób taki jaki zdeklarowałeś w linii zaczynającej się od "def".
>> Wywołujesz funkcje, podając argumenty w tej kolejności i o takiej liczbie jak w definicji
>> Te argumenty które podałeś przy wywołaniu, są podstawiane pod te nazwę którą podałeś w definicji funkcji.

Oczywiście da się ustawić wartości domyślne, przekazywać nawet klasy do funkcji i ogólnie ich zastosowanie jest bardzo przydatne przez dziesiątki możliwości, ale na dobry początek polecam powyższy filmik, poza tym cała playlista tego gościa uczy podstaw pythona Uśmiech.

@Edit
Jak sobie ogarniesz ten program, podrzucam jeszcze pomysł by pobawić się z przyciskiem który pozwoli podmienić numerki zamiast funkcji update'ującej bezsensu cały czas Język.
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
Strony: [1]   Do góry
Drukuj
Skocz do:  

© 2007 - 2019 Polish Python Coders Group
Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | Theme by PixelSlot