Python tkinter ramkasi to'g'ri ko'rsatilmaydi

main_frame= self.create_widget... bilan boshlangan qatorni izohdan olib tashlaganimda banner_strip ramkasi ko'rinmaydi.

agar chiziq sharhlangan bo'lsa, u men xohlagancha ko'rinadi. Bundan tashqari, men 1 dan self.banner_strip = self.create_widget() gacha o'rniga row = 0 ni o'tkazganimda va yuqorida ko'rsatilgan qatorni izohdan olib tashlaganimda, bu chiziqli ramka paydo bo'ladi, lekin ramkaning o'rtasida "Bu qandaydir matn" yorlig'i ustida. Bu erda nima noto'g'ri qilayotganimni bilasizmi?

from tkinter import *

class Application():
    def __init__(self, master):

        self.master = master
        self.master.geometry("700x400+250+150")
        self.master.resizable(False, False)

        self.banner_frame = self.create_widget(master_widget = self.master, widget = Frame(), width = 700, height = 70, bg = '#255869', row = 0, column = 0, bd = 0)
        self.banner_label = self.create_widget(master_widget = self.banner_frame, widget = Label(), bg = '#255869', row = 0, column = 0, pady = 20, text = "This is some text")
        self.banner_strip = self.create_widget(master_widget = self.banner_frame, widget = Frame(), width = 700, height = 10, bg = '#BCC947', row = 1, column = 0)
        #self.main_frame = self.create_widget(self.master, widget = Frame(), width = 700, height = (400 - 80), bd = 0, row = 1, column = 0)

    def create_widget(self, master_widget = None, widget = None, width = 0, height = 0, bg  = None, fg = None, row = 0, column = 0, text = None, bd = None, padx = 0, pady = 0 ):
        widget_type = type(widget)(width = width, height = height, bg = bg, fg  = fg, text = text, bd = bd)
        widget_type.grid(row = row, column = column)
        return widget_type

cl = Tk()
c = Application(cl)
cl.mainloop()

Agar kimdir yechimini bilsa, menga yordam bering. Rahmat!

Tahrirlash: Bu aynan bir xil dastur, lekin create_widget() usulidan foydalanmasdan. Bunda label_frame row=0 va main_frame row=1 juda yaxshi ishlaydi

from tkinter import *

class Application():
    def __init__(self, master):
        self.master = master
        self.master.geometry("700x400+250+150")
        self.master.title("GetCaseQob v2.1")

        self.master.resizable(False, False)

        self.banner_frame = Frame(master, width = 700, height = 70, bd = 0, bg = '#255869')
        self.banner_frame.grid(row = 0, column = 0)

        self.banner_strip = Frame(self.banner_frame, width = 700, height = 10, bd = 0, bg = '#BCC947')
        self.banner_strip.grid(row = 1, column = 0)

        self.banner = Label(self.banner_frame, bg = '#255869', text = 'This is some text')
        self.banner.grid(row = 0, column = 0, pady = 20)

        self.main_frame = Frame(master, width = 700, height = (400-70), bd = 0)
        self.main_frame.grid(row = 1, column = 0)
        self.main_frame.grid_propagate(0)

cl = Tk()
c = Application(cl)
cl.mainloop()

person Faisal Khan    schedule 05.09.2017    source manba
comment
bu sizning asl savolingizning dublikati yaxshiroq misolmi? Agar shunday bo'lsa, boshqa savol yaratish o'rniga asl nusxasini tahrirlashingiz kerak. Bizga bir xil narsani so'rab ikkita savol kerak emas.   -  person Bryan Oakley    schedule 05.09.2017
comment
Men oldingi savolni o'chirib tashladim   -  person Faisal Khan    schedule 05.09.2017


Javoblar (1)


Yangilash:

Haqiqiy muammo widget_type = type(widget) qatoridagi o'zgaruvchilaringizdan biri etishmayotganligidir. Har bir vidjetni aniqlash uchun sizda master_widget ishlatilmagan.

O'zgartirish:

widget_type = type(widget)(width = width, height = height, bg = bg, fg  = fg, text = text, bd = bd)

To:

widget_type = type(widget)(master_widget, width = width, height = height, bg = bg, fg  = fg, text = text, bd = bd)

Bu sizning ramka muammongizni to'g'irlaydi, lekin siz tartiblar oralig'ida ba'zi o'zgarishlarni ko'rasiz. Bu bilan ham shug'ullanish kerak bo'ladi.

Vidjetlaringizni nima uchun oʻzingiz yaratayotganingizdek oʻrnatayotganingizga ishonchim komil emasligi sababli, men sizning kodingizning oʻzgartirilgan versiyasini GUI-ni burishning anʼanaviy usuli bilan yaratdim.

from tkinter import *

class Application():
    def __init__(self, master):

        self.master = master
        self.master.geometry("700x400+250+150")
        self.master.resizable(False, False)

        self.banner_frame = Frame(self.master, width = 700, height = 70, bg = '#255869', bd = 0)
        self.banner_frame.grid(row = 0, column = 0)
        self.banner_label = Label(self.banner_frame, bg = '#255869', text = "This is some text")
        self.banner_label.grid(row = 0, column = 0, pady = 20)
        self.banner_strip = Frame(self.banner_frame, width = 700, height = 10, bg = '#BCC947')
        self.banner_strip.grid(row = 1, column = 0)
        self.main_frame = Frame(self.master, width = 700, height = (400 - 80), bd = 0)
        self.main_frame.grid(row = 1, column = 0)


cl = Tk()
c = Application(cl)
cl.mainloop()
person Mike - SMT    schedule 05.09.2017
comment
Rahmat, bu albatta ishladi. Lekin self.banner_frame va self.main_frame self.master (ildiz ramkasi...shuning uchun banner_frame 0 va main_frame 1 bo'lishi kerak?) va self.label ning farzandi bo'lsa, nima uchun men satr = 2 ni o'rnatishim kerakligini tushuntirib bera olasizmi? va self.banner_strip self.banner_frame ning farzandidir (shu tarzda self.label row= 0 va self.banner_strip row = 1). - person Faisal Khan; 05.09.2017
comment
@FaisalKhan Men javobimni yangiladim, chunki muammoni keltirib chiqaradigan asosiy muammoni topdim. - person Mike - SMT; 05.09.2017
comment
@FaisalKhan Men, shuningdek, kodning o'zgartirilgan versiyasini qo'shdim, bu sizning GUI-ni qanday yozishi mumkinligiga ko'proq mos keladi, chunki siz buni qanday qilib bir oz g'ayrioddiy bo'lib qoldiradi. - person Mike - SMT; 05.09.2017
comment
Oh, biz bir vaqtning o'zida nashr qilganga o'xshaymiz: D. Men sizning javobingizda shunday qildim, lekin men GUIni loyihalashtirmoqdaman, u erda 30 dan 40 gacha turli xil vidjetlar mavjud va har bir vidjet uchun bir xil kodni takrorlash (ya'ni, panjara va boshqalar) disk raskadrovka qilishni qiyinlashtiradi. Shuning uchun men buni usul yordamida qilishni va kerakli parametrlarni o'tkazishni xohladim - person Faisal Khan; 05.09.2017
comment
@FaisalKhan Agar siz vidjetlar yaratishda o'zingizni takrorlashingiz kerak bo'lsa, ro'yxat yoki lug'atni afzal usul sifatida ishlatishingiz mumkin. Bu uzoq muddatda muammolarni bartaraf etish va texnik xizmat ko'rsatishni ancha yaxshilaydi. - person Mike - SMT; 05.09.2017