Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: περασμα τιμης απο function se function

περασμα τιμης απο function se function 7 Χρόνια 3 Εβδομάδες πριν #4805

  • nikpol
  • Το Άβαταρ του/της nikpol
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 42
Δυσκολευομαι να περασω μια τιμη απο συναρτηση σε συναρτηση.Συγκεκριμμενα σε φορμα εχω ενα listbox με διαφορα element εντος.
Διαλεγω με κλικ μια επιλογη και θελω να την δουλεψω σε μια αλλη function.Mexri στιγμης δεν το μπορω.Εχω το παρακατω
........
def init_window(self):
.....
.....
# listbox
 
        lb1=Listbox(self,width=60)
 
        lb1.pack()
........
lb1.bind("<Button-1>", self.getSelection)
........
for item in children:  #briskei to link apo th sxolh kai ftiaxnei to url poy zhtame
            if value in item:
 
                num=item.index('#')
                urlf=item[num+1:]
                print(urlf)
 
def getSelection(self, event):  #briskei ti kaneiw click stiw sxoles
 
        w = event.widget
        ind=int(w.curselection()[0])
        value = w.get(ind)
        print('dialejes %d: "%s"'%(ind,value))
        #click=value
        #print(click)
        return value
 
δεν μπορω να περασω το value της getselection sto παραπανω if value in item: κλπ
Υπαρχει τροπος να γινει?
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

περασμα τιμης απο function se function 7 Χρόνια 3 Εβδομάδες πριν #4806

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Δες λίγο ένα παράδειγμα από ένα βιβλίο. Βάζω μόνο τις γραμμές κώδικα που νομίζω θα σε βοήθησουν
def handleList(self, event):
  index = self.listbox.curselection() # on list double-click
  label = self.listbox.get(index) # fetch selection text
 
 
def makeWidgets(self, options):
  list = Listbox(self, relief=SUNKEN)
  list.bind('<Double-1>', self.handleList) # set event handler
  self.listbox = list

Προσωπικά δεν θα έβαζα καθόλου event στο Listbox ειδικά με απλό klik γιατί το klik είναι και αυτό που θα σου επιλέξει το στοιχείο. Ξεκινάς δηλαδή ένα event ενώ μπορεί κάποιος να πατήσει λάθος και να το αλλάξει μετά. Κάνε την επιλογή του στοιχείου σου και τις ενέργειες κάντες με ένα button ή με το event enter να είναι ξεκάθαρο
Τελευταία διόρθωση: 7 Χρόνια 3 Εβδομάδες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

περασμα τιμης απο function se function 7 Χρόνια 3 Εβδομάδες πριν #4811

  • nikpol
  • Το Άβαταρ του/της nikpol
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 42
theo σε ευχαριστω για την απαντηση σου.Δουλευει ετσι οπως το εχω αλλα το προβλημα μου παραμενει.Δεν μπορω να περασω values εξω απο τη getselection.Το προχωρησα ,εκανα μασουρι τη getselection.Ολος ο κωδικας εκει μεσα.Βγαζω αποτελεσμα αλλα δεν μου αρεσει ετσι οπως εγινε.Μαλλον θα πρεπει να ξαναδω τα βασικα.Και παλι ευχαριστω.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

περασμα τιμης απο function se function 7 Χρόνια 3 Εβδομάδες πριν #4812

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Αν έχεις κάποιο link να δω όλο τον κώδικά σου ή είναι στο github πές μου

Στις κλάσεις παντώς γενικά δεν χρειάζεται να παιρνάμε κάπως τιμές από μία μέθοδο στην άλλη

Στο συγκεκριμένο παράδειγμα
αν κάνω την lb1 self.lb1 μπορώ σε όποια μέθοδο θέλω να την καλέσω
........
def init_window(self):
 
        self.lb1=Listbox(self,width=60)
 
        self.lb1.pack()
 
        self.lb1.bind("<Button-1>", self.getSelection)
 
def getSelection(self, event):  #briskei ti kaneiw click stiw sxoles
 
        value=self.lb1.get(self.lb1.cureselection())
        print('dialejes {}'.format(value))
 

και δεν χρειάζεται να είναι event όποτε θέλω εφόσον βέβαια έχει εκτελεστεί η init_window
μπορώ να καλέσω τη self.lb1mplampla
Τελευταία διόρθωση: 7 Χρόνια 3 Εβδομάδες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

περασμα τιμης απο function se function 7 Χρόνια 2 Εβδομάδες πριν #4813

  • nikpol
  • Το Άβαταρ του/της nikpol
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 42
trinket.io/python/da95558522
μενει να βαλω τηλεφωνα και να τυπωσω με pandas
Ευχαριστω για το χρονο που διαθετεις
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

περασμα τιμης απο function se function 7 Χρόνια 2 Εβδομάδες πριν #4814

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Εγώ πάντως θα έκανα την value πεδίο της Class. Δηλαδή:
........
def init_window(self):
 
    self.value = None
 
    for item in children: 
            if self.value in item:
 
                num=item.index('#')
                urlf=item[num+1:]
                print(urlf)
 
def getSelection(self, event):
 
        w = event.widget
        ind=int(w.curselection()[0])
        self.value = w.get(ind)
        print('dialejes %d: "%s"'%(ind,value))
        #click=value
        #print(click)
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

περασμα τιμης απο function se function 7 Χρόνια 2 Εβδομάδες πριν #4815

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Είδα τον κώδικα
Ωραίος, Είναι πολύ βασικό ότι δουλεύει
Έχω κάνει κάποιες αλλαγές σου δείχνω τον κώδικα και εξηγώ
 
from tkinter import *
import requests
from bs4 import BeautifulSoup
#Μέσα στην κλάση αφήνω μόνο ότι έχει να κάνει με γραφικό κομμάτι όχι τελείως αλλά όσο μπόρεσα
# Μέσα από την κλάση καλώ τις συναρτήσεις που ψάχνουν τον σπιτόγατο η οποίες όμως είναι ξεχωριστές
class Window(Frame):
  def __init__(self, master=None):
    Frame.__init__(self, master)
    self.master = master
    self.init_window()
    self.populate_listbox()
 
  def init_window(self):
    self.pack(fill=BOTH, expand=1)
    menu = Menu(self.master)
    self.master.config(menu=menu)
    file = Menu(menu)
    file.add_command(label="Exit", command=self.quit)
    menu.add_cascade(label="File", menu=file)
    edit = Menu(menu)
    edit.add_command(label="Undo")
    menu.add_cascade(label="Edit", menu=edit)
    quitButton = Button(self, text="Εξοδος",command=self.quit)
    quitButton.place(x=300, y=290) #0.0 einai panv aristera.+x move dejia.+y move down
    self.lb1=Listbox(self,width=60)##
    self.lb1.pack()
    #self.lb1.bind("<Double-1>", self.getSelection)
    l = Label(root, text='Επιλογη σχολης για αναζητηση κατοικιας').place(x=120,y=180)
    ltimapo=Label(root, text='Ενοικιο απο').place(x=10,y=220)
    ltimews=Label(root, text='Ενοικιο εως').place(x=120,y=220)
    timapo=Text(root, height=1, width=4).place(x=80,y=220)
    timews=Text(root, height=1, width=4).place(x=190,y=220)
    lembapo=Label(root, text='Εμβαδον απο').place(x=220,y=220)
    embapo=Text(root, height=1, width=4).place(x=300,y=220)
    lembews=Label(root, text='Εμβαδον εως').place(x=340,y=220)
    embews=Text(root, height=1, width=4).place(x=420,y=220)
    searchButton = Button(self, text="Αναζητηση", command=self.search_spitia) #,command=self.anazhthsh)
    searchButton.place(x=100, y=290)
 
  def populate_listbox(self):
    for sxoli in get_sxoles_spitogatos():
       self.lb1.insert(END, sxoli)
 
  def search_spitia(self):
    url_sxolis=self.lb1.get(self.lb1.curselection())[1]
    print(get_spitia_sxolis(url_sxolis))
 
#Η συνάρτηση που παίρνει τις σχολές από τον σπιτόγατο είναι ξεχωριστή και ανεξάρτητη
 
def get_sxoles_spitogatos():
    sxoles = []
    url = "https://www.spitogatos.gr/students/"
    r = requests.get(url)
    soup = BeautifulSoup(r.text,'html.parser')
    for link in soup.find_all('a'):
      try :
        st=link.get('href')
        if st[0:35]==url:
          sxoles.append((link.get_text().strip(),st)) 
      except:
        pass
    return sxoles
 
# H συνάρτηση που παίρνει τα σπίτια για κάθε σχολή είναι ξεχωριστή
def get_spitia_sxolis(url_sxolis):  #briskei ti kaneiw click stiw sxoles
    r = requests.get(url_sxolis)
    soup = BeautifulSoup(r.text,'html.parser')
    if r.status_code !=200:
      print('\n ----den brhka selida---')
    spitia=[]
    for link in soup.find_all('div',{'id':"listingsSection"}):
      for lin in link.find_all('a',{'href':"#"} ):
        for li in lin.find_all('div',{'class':"tableCell"}):
          lek=li.text
          lek=' '.join(lek.split())
          val=lin.get('id')
          spiti=lek+'#'+val+'?'
          spitia.append(spiti)
    if spitia==[]:
      print('++++++++++den yparxoyn spitia++++++++++\n')
    return spitia              
 
 
 
root = Tk()
root.geometry("500x400")# se pixels
app=Window(root)
root.mainloop()

Έσβησα αρκετά κομμάτια από τον κώδικά σου για να γίνει πιο απλό
Η γενική ιδέα που προτείνω είναι να είναι ξεχωριστά το γραφικό κομμάτι
από τις συναρτήσεις που κάνουν το parse στο σπιτόγατο
Τελευταία διόρθωση: 7 Χρόνια 2 Εβδομάδες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

περασμα τιμης απο function se function 7 Χρόνια 2 Εβδομάδες πριν #4816

  • nikpol
  • Το Άβαταρ του/της nikpol
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 42
Εξαιρετικη η δομη theo.Ετσι ηθελα να το κανω και δεν μπορουσα.Μου εδειξες το δρομο και σε ευχαριστω.Θα το εχω για μπουσουλα για τα επομενα.Ευχαριστω φιλε μου και παλι
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

περασμα τιμης απο function se function 7 Χρόνια 2 Εβδομάδες πριν #4817

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Χαίρομαι που βοήθησα όπου κολλάς και θες βοήθεια ρώτα

Μια μικρή παρέμβαση ακόμα σε κάτι που δεν μου αρέσει και αυτό είναι το print των αποτελεσμάτων στην consola. Τα αποτελέσματα καλό είναι να γυρνάνε στο παράθυρο.

Μπορείς να κάνεις ένα δεύερο Listbox

βάζοντας στην init_window
self.lb2=Listbox(self,width=60)##
self.lb2.pack()

και μετά αλλάζεις την συνάρτηση που κάνει print
να βάζει τα στοιχεία της στο νέο listbox
Αντί αυτό
def search_spitia(self):
    url_sxolis=self.lb1.get(self.lb1.curselection())[1]
    print(get_spitia_sxolis(url_sxolis))
 
Αυτό
def search_spitia(self):
    url_sxolis=self.lb1.get(self.lb1.curselection())[1]
    spitia=get_spitia_sxolis(url_sxolis)
    self.lb2.delete(0, END)
    for spiti in spitia:
      self.lb2.insert(END, spiti)
 
Το self.lb2.delete(0, END) είναι ώστε σε κάθε αναζήτηση να καθαρίζει την προηγούμενη
Για να δεις τα αποτελέσματα πρέπει να σβήσεις το root.geometry για να χωράνε όλα και να κάνεις το παράθυρο maximize γιατί λόγω ανακατέματος pack και place πέφτει τον ένα widget πάνω στο άλλο :)
Τελευταία διόρθωση: 7 Χρόνια 2 Εβδομάδες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.510 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου