проблема с отображением пространства на виджетах tkinter - PullRequest
0 голосов
/ 25 мая 2019

Я только что выучил tkinterr, я хочу, чтобы виджеты отображались с помощью tkinter, у меня возникла проблема при создании макета, текст, который я хочу отображать вместо этого, центрирован, могу ли я получить помощь в размещении текста на связанном виджете в левом углу? и использование аккуратных пространств или учебные рекомендации для управления макетами на виджетах внешний вид как это .

import time
import serial
from Tkinter import *

serial_speed = 115200
serial_port = '/dev/ttyACM0'

ser = serial.Serial(serial_port, serial_speed, timeout=1)

class Application(Frame):

    def measure(self):

         ser.write("m")
        data = ser.readline()

        # If the answer is not empty, process & display data
        if (data != ""):
            processed_data = data.split(",")

            self.tegangan_data.set("TEGANGAN: " + str(processed_data[0]))
            self.tegangan.pack()

            self.arus_data.set("    ARUS    : " + str(processed_data[1]))
            self.arus.pack()

            self.daya_data.set("   DAYA : " + str(processed_data[2]))
            self.daya.pack()

            self.torsi_data.set("   TORSI   : " + str(processed_data[3]))
            self.torsi.pack()

            self.panas_data.set("   PANAS MESIN : " + str(processed_data[4]))
            self.panas.pack()

            self.jarak_data.set("   JARAK TEMPUH    : " + str(processed_data[5]))
            self.jarak.pack()

        # Wait 1 second between each measurement
        self.after(500,self.measure)

    # Create display elements
    def createWidgets(self):

        self.tegangan = Label(self, textvariable=self.tegangan_data, font=('Verdana', 20, 'bold'))
        self.tegangan_data.set("Tegangan")
        self.tegangan.pack()


        self.arus = Label(self, textvariable=self.arus_data, font=('Verdana', 20, 'bold'))
        self.arus_data.set("Arus")
        self.arus.pack()

        self.daya = Label(self, textvariable=self.daya_data, font=('Verdana', 20, 'bold'))
        self.daya_data.set("Daya")
        self.daya.pack()

        self.torsi = Label(self, textvariable=self.torsi_data, font=('Verdana', 20, 'bold'))
        self.torsi_data.set("Torsi")
        self.torsi.pack()

        self.panas = Label(self, textvariable=self.panas_data, font=('Verdana', 20, 'bold'))
        self.panas_data.set("Panas mesin")
        self.panas.pack()

        self.jarak = Label(self, textvariable=self.jarak_data, font=('Verdana', 20, 'bold'))
        self.jarak_data.set("Daya")
        self.jarak.pack()


     def __init__(self, master=None):
        Frame.__init__(self, master)
        self.tegangan_data = StringVar()
        self.arus_data = StringVar()
        self.daya_data = StringVar()
        self.torsi_data = StringVar()
        self.panas_data = StringVar()
        self.jarak_data = StringVar()

        self.createWidgets()
        self.pack()
        self.measure()
root = Tk()
app = Application(master=root)
app.mainloop()

1 Ответ

0 голосов
/ 26 мая 2019

Чтобы сделать метки выровненными по левому краю в вашем окне, вы можете изменить код в методе «measure» на:

            self.tegangan_data.set("TEGANGAN: " + str(processed_data[0]))
            self.tegangan.pack(anchor='w')

            self.arus_data.set("ARUS: " + str(processed_data[1]))
            self.arus.pack(anchor='w')

            self.daya_data.set("DAYA: " + str(processed_data[2]))
            self.daya.pack(anchor='w')

            self.torsi_data.set("TORSI: " + str(processed_data[3]))
            self.torsi.pack(anchor='w')

            self.panas_data.set("PANAS MESIN: " + str(processed_data[4]))
            self.panas.pack(anchor='w')

            self.jarak_data.set("JARAK TEMPUH: " + str(processed_data[5]))
            self.jarak.pack(anchor='w')

Что приведет к этому:

UI of updated program

Теперь, если вы развернете окно по горизонтали, вы увидите, что даже если надписи остаются выровненными по левому краю, они не прилипают к левой стороне окна, а вместо этого остаются в середине. Я не знаю, хотите ли вы такое поведение или нет, но если вы хотите понять, почему это произошло, измените строку, инициализирующую окно Frame, на:

Frame.__init__(self, master, borderwidth=5, relief=RIDGE)

Этикетки в настоящее время упакованы с левой стороны рамки, но содержащая их рамка не упакована с левой стороны окна. Кадр можно упаковать так же, как и другие виджеты интерфейса пользователя Tkinter. Поскольку вы унаследовали от Frame в классе Application, вы можете использовать его после вызова конструктора Application (если вы хотите, чтобы рамка и метки оставались в левой части окна):

app.pack(anchor='w')

Вы также можете использовать:

app.pack(side='left')

Хотя в их поведении есть разница, но я оставлю это вам для изучения.

Наконец, чтобы улучшить внешний вид приложения, вы можете настроить фрейм так, чтобы он всегда имел отступы между ним и краями окна. Попробуйте это:

app.config(padx=20)
app.config(pady=10)

Хороший источник информации об использовании pack (): https://effbot.org/tkinterbook/pack.htm

Если вы хотите сделать сложную компоновку в Tkinter, вам следует проверить grid (): https://effbot.org/tkinterbook/grid.htm

Также рекомендуется проверить документацию с виджетами, с которыми вам придется работать, например, Рамка http://effbot.org/tkinterbook/frame.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...