Печать этикетки tkinter на новой линии - PullRequest
0 голосов
/ 14 октября 2019

Прежде всего, извините за это смутное название. Я делаю приложение на Python, которое показывает время, выбирает погоду и новости. Теперь, когда я печатаю новости через ярлык tkinter, он печатает заголовки новостей в отдельной строке, но в центре. Если я пытаюсь указать геометрию .pack (side = LEFT), она идет влево, но все заголовки печатаются в строке, а не в новой строке. Я попытался добавить новую строку с помощью '\ n' и даже возврата каретки '\ n', но тщетно. Пожалуйста, помогите мне с этим вопросом. Прикрепив код ниже.

Ps Я не смог получить новости для работы с циклом For, поэтому я вручную печатал массивы.

from tkinter import *
import datetime
from PIL import Image, ImageTk
import requests



class Clock(Frame):
    def __init__(self, parent):
        Frame.__init__(self,parent, bg='black')
        self.now = datetime.datetime.today()
        self.time = str(self.now.hour) + ":" + str(self.now.minute)
        self.timelb = Label(self, text=self.time, font=("Helvetica 50"), bg='black', fg='white')
        self.timelb.pack(anchor=NE,padx=60,pady=0)
        self.date = str(self.now.day) + '.' + str(self.now.month) + '.' + str(self.now.year)
        self.day = self.now.strftime('%A')
        self.daylb = Label(self, text=self.day, font="Helvetica 20", bg='black', fg='white')
        self.daylb.pack(anchor=NE,padx=60)
        self.datelb = Label(self, text=self.date, font="Helvetica 25", bg = 'black', fg='white')
        self.datelb.pack(anchor=NE, padx=60)



class Weather(Frame):
    def __init__(self, parent):
        Frame.__init__(self,parent,bg='black')
        url = 'http://api.openweathermap.org/data/2.5/weather?appid=c73d9cdb31fd6a386bee66158b116cd0&q=Karachi&units=metric'
        json = requests.get(url).json()
        temperature = json['main']['temp']
        description = json['weather'][0]['description']
        icon_id = json['weather'][0]['icon']
        city = 'Karachi'
        icon_url = ('http://openweathermap.org/img/wn/{icon}@2x.png'.format(icon=icon_id))
        self.im = Image.open(requests.get(icon_url, stream=True).raw)
        self.ph = ImageTk.PhotoImage(self.im)
        degree = u'\N{DEGREE SIGN}' + 'C'
        self.pic_label = Label(self,image=self.ph,bg='black')
        self.pic_label.pack()
        self.lab= Label(self,text=(str(temperature) + degree),font=("Helvetica 40"), bg='black', fg='white')
        self.lab.pack()
        self.description_label=Label(self, text=description, font='Helvetica 20',bg='black', fg='white')
        self.description_label.pack()
        self.city_label=Label(self, text=city, font = 'Helvetica 10', bg='black', fg='white')
        self.city_label.pack()

class News(Frame):
    def __init__(self, parent):
        super(News, self).__init__(bg='black')  
        url = " https://newsapi.org/v1/articles?source=bbc-news&sortBy=top&apiKey=caa7f97ce8f2400a9785cbe704afc345"
        json = requests.get(url).json()
        self.title = 'Headlines'
        self.title_lb = Label(self, text=self.title, font='Helvetica 25',bg='black', fg='white')
        self.title_lb.pack(side=TOP, anchor=N)
        im = Image.open('Newspaper_reduced.png')
        self.pho = ImageTk.PhotoImage(im)
        news1 = json['articles'][0]['title'] 
        news2 = json['articles'][1]['title'] 
        news3 = json['articles'][2]['title']  
        news4 = json['articles'][3]['title']  
        news5 = json['articles'][4]['title']
        self.img = Label(self,image=self.pho,bg='black')
        self.img.pack(side=LEFT)
        self.headline1_lb = Label(self, text=news1, font = 'Helvetica 15' ,bg='black', fg='white')
        self.headline1_lb.pack(side=LEFT)
        self.img2 = Label(self,image=self.pho,bg='black')
        self.img2.pack(side=LEFT)
        self.headline2_lb = Label(self, text = news2, font='Helvetica 15',bg='black', fg='white')
        self.headline2_lb.pack(side=LEFT)
        self.img3 = Label(self,image=self.pho,bg='black')
        self.img3.pack(side=LEFT)
        self.headlines3_lb = Label(self, text=news3, font='Helvetica 15',bg='black', fg='white')
        self.headlines3_lb.pack(side=LEFT)
        self.img4 = Label(self,image=self.pho,bg='black')
        self.img4.pack(side=LEFT)
        self.headlines4_lb = Label(self, text=news4, font='Helvetica 15',bg='black', fg='white')
        self.headlines4_lb.pack(side=LEFT)
        self.img5 = Label(self,image=self.pho,bg='black')
        self.img5.pack(side=LEFT)
        self.headlines5_lb = Label(self, text=news5, font='Helvetica 15',bg='black', fg='white')
        self.headlines5_lb.pack(side=LEFT)




class Fullscreen:
    def __init__(self):
        self.tk = Tk()
        self.tk.configure(bg='black')
        self.tk.title('smartmirror')
        self.topFrame = Frame(self.tk , bg='black')
        self.topFrame.pack(side=TOP, fill=BOTH, expand=YES)
        self.bottomFrame = Frame(self.tk, bg='black')
        self.bottomFrame.pack(side=BOTTOM, fill=BOTH, expand=YES)
        self.clock = Clock(self.topFrame)
        self.clock.pack(side=RIGHT, anchor=NE, padx=50, pady=60)
        self.weather = Weather(self.topFrame)
        self.weather.pack(side=LEFT, anchor=NW, padx=50, pady=70)
        self.news = News(self.bottomFrame)
        self.news.pack(side=BOTTOM, anchor=S)

if __name__ == '__main__':
    w = Fullscreen()
    w.tk.mainloop

1 Ответ

1 голос
/ 14 октября 2019

Во-первых: я удалил изображения в коде, потому что у меня их нет, и я хочу тратить время на поиск изображений, которые я мог бы использовать в качестве замены.


Если вы установите другой цвет для ярлыков, тотогда вы видите, что они имеют разную ширину - они используют ширину текста.

enter image description here

Если вы используете

self.headline1_lb.pack(fill='x') 

, то они будут использоватьтакая же ширина, но текст по-прежнему находится в центре.

enter image description here

Если вы используете

Label(..., anchor='w')

, то текст будет перемещен влевоside.

enter image description here

Если вы добавите текст Label с несколькими строками, вам также может понадобиться

Label(..., anchor='w', justify='left')

Если вы хотитеиспользуйте полную ширину окна для текста, тогда вы должны использовать fill='x'

self.news.pack(side=BOTTOM, anchor='s', fill='x')

enter image description here

После этого вы можете снова установить black фон.

...