पृष्ठभूमि: मेरे टिंकर एप्लिकेशन में एक छोटी सी विशेषता है जो सूची से दो यादृच्छिक मानों को यादृच्छिक बनाता है और उन्हें जीयूआई में प्रिंट करता है। लेकिन मैं यादृच्छिक मूल्य के साथ सही छवि (टीम लोगो) प्राप्त करने के लिए संघर्ष कर रहा हूँ।

लक्ष्य: यादृच्छिक टीम का नाम है (28 टीमों की सूची से) और GUI को टीम का लोगो भी दिखाना चाहिए। "रैंडम" बटन दबाने से टीम 1 और टीम 2 उत्पन्न होती है और दोनों में टेक्स्ट के आगे लोगो होना चाहिए।

enter image description here

मैंने इसके बारे में शोध किया है: मेरे पास इस उत्तर के साथ समय था, लेकिन मैं इसका पता नहीं लगा सका। यह पासा खेल थोड़े करता है लेकिन मुझे एक के बजाय दो मूल्यों की आवश्यकता है और मेरी सूची तारों से भरी है।

उदाहरण: https://stackoverflow.com/a/27913052/5132305

import random
import tkinter as tk
from PIL import ImageTk, Image

 # Use a class that hold all Team data
class Team():
   def __init__(self, name, img_filename):
    self.name = name
    self.img_filename = img_filename

   @property
   def image(self):
    # TODO: Open image file and return .PhotoImage object
    team_logo = Image.open("%s.jpg" % (self.img_filename))
    render = ImageTk.PhotoImage(team_logo)
    self.img_filename.image = render
    return self.img_filename

   #This is how the class prints
   def __str__(self):
    return "Name: {} Image:{}".format(self.name, self.img_filename)


class MainWindow(tk.Frame):
      def __init__(self, parent, *args, **kwargs):
       tk.Frame.__init__(self, parent,  *args, **kwargs)
       root.geometry("700x450")
       text_1 = tk.Label(text="VS", fg="red", anchor="center")
       text_1.place(relx=.5, rely=.5, anchor="center")
       text_2 = tk.Label(text="RANDOM GAME", fg="green", anchor="n")
       text_2.pack(side="top")

       # Button for randomize
       self.parent = parent
       self.frame = tk.Frame(self.parent)
       self.randomButton = tk.Button(self.frame, text = 'RANDOM', 
       command=self.genRanTeam)
       self.randomButton.pack(side="bottom")
       self.frame.pack(side="bottom")

       self.home_name = tk.StringVar()
       self.visitor_name = tk.StringVar()

       if 0: # TODO: Implement Team.image
           # Images, I should somehow use this with home/visitor label?
           # Yes, look at TODO in def genRanTeam(...

           load = Image.open("%s.jpg" % (self.home.image))
           render = ImageTk.PhotoImage(load)
           # ONLY, if you decide to use OWN Label for Image
           # What you suggest for this? So if I decide to only use home/visitor labels, I don't need next 4 lines of code (after this text?)
           self.team_logo = tk.Label(parent, image=render)
           self.team_logo.image = render
       else:
           self.team_logo = None


       # Home team
       self.home_label = tk.Label(Image = self.team_logo, textvariable=self.home_name) 
       self.home_label.pack(side="left")
       # Visitor team
       self.visitor_label = tk.Label(Image = self.team_logo, textvariable=self.visitor_name) 
       self.visitor_label.pack(side="right")

       self.__init__Teams()

      # Hold this in a own function for brevity
      def __init__Teams(self):
        self.teams = [Team('Chicago Fire', 'chicago'), Team('New York \
        Red Bulls', 'newyork'), Team('Philadelphia Union', 'phila'), 
        Team('Toronto FC', 'toronto')]
        # Init defaults
        self.home = self.teams[0]
        self.visitor = self.teams[0]

      def genRanTeam(self):
        # Use the initalized Teams from MainWindow..__init__
        self.__init__Teams()
        self.home = random.choice(self.teams)
        self.visitor = None
        # Loop while home == visitor
        while self.visitor is None or self.home.name is self.visitor.name:
         self.visitor = random.choice(self.teams)

        self.home_name.set(self.home.name)
        self.visitor_name.set(self.visitor.name)   

        # TODO: Configure .team_label with Team.image
        # self.home_label.configure(image=self.home.image)
        self.home_label.configure(image=self.home.image)
        self.visitor_label.configure(image=self.visitor.image)

if __name__ == "__main__":
         root = tk.Tk()
         main = MainWindow(root)
         main.pack(side="top", fill="both", expand=True)
         root.mainloop()

अब जब मैं रैंडम-बटन दबा रहा हूं, तो यह सूची से x और y चर के लिए यादृच्छिक रूप से सही मान करता है।

मेरे पास फ़ोल्डर प्रोजेक्ट/छवियों में 28 छवियां भी हैं। सभी चित्र "team_name.jpg" हैं

प्रश्न 1: मैं टीम के नाम और लोगो की सूची और मिलान कैसे करूँ?

सभी मदद की सराहना की जाती है और कुछ कोड समीक्षा भी बहुत अच्छी होगी! (एसओ में पहला सवाल!)

2
ponkape 30 सितंबर 2018, 19:19

1 उत्तर

सबसे बढ़िया उत्तर

टिप्पणी: Team.image लागू करें

अपना Team.image चलाने से मुझे यह मिलता है:

self.img_filename.image = render
AttributeError: 'str' object has no attribute 'image'

आप str ऑब्जेक्ट बनाने में नई विशेषता नहीं जोड़ सकते हैं। यह काम करेगा, इसमें बदलें:

self.render = ImageTk.PhotoImage(team_logo)
return self.render

टिप्पणी: क्या मुझे टीम छवि के लिए एक और tk.लेबल बनाने की आवश्यकता है?

ऐसा करने की कोई आवश्यकता नहीं है, यह आपके इच्छित लेआउट पर निर्भर करता है।
एक tk.Label(self, image=image, textvariable=name)
. से शुरू करें ऐसा दिखता है:
यहां छवि विवरण दर्ज करें प्रासंगिक: label-on-top-of-image-in-python

टिप्पणी: क्या यह संभव है कि self.visitor टीम+लोगो दिखा सके?

कुछ भी दिखाना class Team() का काम नहीं है, यह tk.Lable(... का काम है।
प्रासंगिक: updating-tkinter-label-with-an-image


प्रश्न: सूची से दो यादृच्छिक मानों को छवियों के साथ मिलान करने की आवश्यकता है

यह दृष्टिकोण दो सूचियों का उपयोग नहीं करता है, यह एक वर्ग में दोनों मानों (टीम का नाम, टीम छवि) को परिभाषित करता है। इसलिए किसी मिलान की आवश्यकता नहीं है।
उदाहरण के लिए:

# Use a class that hold all Team data
class Team():
    def __init__(self, name, img_filename):
        self.name = name
        self.img_filename = img_filename

    # This is how the class prints
    def __str__(self):
        return "Name: {} Image:{}".format(self.name, self.img_filename)

class MainWindow(tk.Frame):
    def __init__(self, parent, *args, **kwargs):

        # Up to 28 teams - Defined in __init__ only once
        # Create a list with all Teams using class Team
        self.teams = [Team('Chicago Fire', 'logo1.jpg'), Team('New York Red Bulls', 'logo2.jpg'), Team('Philadelphia Union', 'logo3.jpg'), Team('Toronto FC', 'logo4')]
        # Init defaults
        self.home = self.teams[0]
        self.visitor = self.teams[0]

    def genRanTeam(self):
        # Use the initalized Teams from __init__
        self.home = random.choice(self.teams)

        self. visitor = None
        # Loop while home == visitor
        while self.visitor is None or self.home is self.visitor:
            self.visitor = random.choice(self.teams)

if __name__ == "__main__":
    import time

    root = tk.Tk()
    main = MainWindow(root)
    for _ in range(3):
        main.genRanTeam()
        print("home:{} :\tvisitor:{}".format(main.home, main.visitor))
        time.sleep(1)

आउटपुट:

home:Name: Toronto FC Image:logo4 : visitor:Name: Chicago Fire Image:logo1.jpg
home:Name: New York Red Bulls Image:logo2.jpg : visitor:Name: Toronto FC Image:logo4
home:Name: Toronto FC Image:logo4 : visitor:Name: New York Red Bulls Image:logo2.jpg

पायथन के साथ परीक्षण किया गया: 3.4.2

1
stovfl 10 नवम्बर 2018, 20:22