cqwcns 发表于 2021-11-16 10:51

Python tkinter的灵异事件

有没有大佬玩过tkinter,我正在尝试写一个布局,其他组件都没有问题,唯独这个分割线(Separator)特别调皮,不能放到正确的行(效果见图),求大佬帮忙看看什么原因,谢谢。

from tkinter import *
from tkinter import ttk


class tanZhen:

    def __init__(self, root):

      # 窗口属性
      root.title("探针数据处理")
      ww = 800
      wh = 600
      sw = root.winfo_screenwidth()
      sh = root.winfo_screenheight()
      # 计算窗口位置
      x = (sw-ww) / 2
      y = (sh-wh) / 2
      root.geometry("%dx%d+%d+%d" % (ww, wh, x, y))

      # 创建组件
      mainframe = ttk.Frame(root, padding="50 30")

      # 渲染组件
      mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
      # 响应式布局
      root.columnconfigure(0, weight=1)
      root.rowconfigure(0, weight=1)

      # 选择文件标签
      label_select_file = ttk.Label(mainframe, text="选择文件")
      label_select_file.grid(row=0, column=0, sticky=W, pady=10)
      label_select_file.config(font=("宋体", 12, "bold"))

      # 探针标签框
      ttk.Label(mainframe, text="探针表").grid(row=1, column=0, sticky=W)
      # 探针输入框
      self.entry_tanzhen = StringVar()
      entry_tanzhen = ttk.Entry(mainframe, textvariable=self.entry_tanzhen)
      entry_tanzhen.grid(row=1, column=1, sticky=(W, E), padx=10, pady=10)
      # 响应式布局
      mainframe.columnconfigure(1, weight=1)
      # 探针选择按钮
      btn_tanzhen = ttk.Button(mainframe, text='选择', command='')
      btn_tanzhen.grid(row=1, column=2)

      # 全量资源标签框
      ttk.Label(mainframe, text="全量资源表").grid(row=2, column=0, sticky=W)
      # 全量资源输入框
      self.entry_ziyuan = StringVar()
      entry_ziyuan = ttk.Entry(mainframe, textvariable=self.entry_ziyuan)
      entry_ziyuan.grid(row=2, column=1, sticky=(W, E), padx=10, pady=10)
      # 响应式布局
      mainframe.columnconfigure(1, weight=1)
      # 全量资源选择按钮
      btn_tanzhen = ttk.Button(mainframe, text='选择', command='')
      btn_tanzhen.grid(row=2, column=2)

      # 用户班表标签框
      ttk.Label(mainframe, text="用户班表").grid(row=3, column=0, sticky=W)
      # 用户班输入框
      self.entry_yonghuban = StringVar()
      entry_yonghuban = ttk.Entry(
            mainframe, textvariable=self.entry_yonghuban)
      entry_yonghuban.grid(row=3, column=1, sticky=(W, E), padx=10, pady=10)
      # 响应式布局
      mainframe.columnconfigure(1, weight=1)
      # 用户班选择按钮
      btn_tanzhen = ttk.Button(mainframe, text='选择', command='')
      btn_tanzhen.grid(row=3, column=2)

      # 分隔线
      ttk.Separator(root, orient=HORIZONTAL).grid(
            row=4, sticky='W,E', padx=50)

      # 处理数据标签
      label_work_with_data = ttk.Label(mainframe, text="处理数据")
      label_work_with_data.grid(row=5, column=0, sticky=W, pady=10)
      label_work_with_data.config(font=("宋体", 12, "bold"))

      # 处理数据操作标签
      ttk.Label(mainframe, text="处理数据").grid(row=6, column=0, sticky=W)
      # 处理数据按钮
      btn_work_with_data = ttk.Button(mainframe, text='开始处理数据', command='')
      btn_work_with_data.grid(row=6, column=2)

      # 分隔线
      ttk.Separator(root, orient=HORIZONTAL).grid(
            row=7, sticky='W,E', padx=50)

      # 处理结果标签
      label_work_with_data = ttk.Label(mainframe, text="处理结果")
      label_work_with_data.grid(row=8, column=0, sticky=W, pady=10)
      label_work_with_data.config(font=("宋体", 12, "bold"))

root = Tk()
tanZhen(root)
root.mainloop()


小文fans 发表于 2021-11-16 11:25

加油,期待你的表现。

iokeyz 发表于 2021-11-16 11:52

本帖最后由 iokeyz 于 2021-11-16 11:54 编辑

换用 place() 硬编码位置

widget.place( place_options )
    anchor: The exact spot of widget other options refer to: may be N, E, S, W, NE, NW, SE, or SW, compass directions indicating the corners and sides of widget; default is NW (the upper left corner of widget)
    bordermode: INSIDE (the default) to indicate that other options refer to the parent's inside (ignoring the parent's border); OUTSIDE otherwise.
    height, width: Height and width in pixels.
    relheight, relwidth: Height and width as a float between 0.0 and 1.0, as a fraction of the height and width of the parent widget.
    relx, rely: Horizontal and vertical offset as a float between 0.0 and 1.0, as a fraction of the height and width of the parent widget.
    x, y: Horizontal and vertical offset in pixels.

cqwcns 发表于 2021-11-16 12:01

iokeyz 发表于 2021-11-16 11:52
换用 place() 硬编码位置

widget.place( place_options )


用gird不行吗?

这个例子gird是可以的。

from tkinter import *
from tkinter import ttk

root=Tk()
s=ttk.Style()
s.configure('red.TSeparator',background='red')
root.geometry('320x240')
sep=ttk.Separator(root,orient='horizontal', style='red.TSeparator')
Label(root, text="ALARM TEXT_1").grid(row=0, column=0, sticky='EW', pady=5, padx=5)
Label(root, text="ALARM TEXT_2").grid(row=0, column=1, sticky='EW', pady=5, padx=5)
sep.grid(row=1,column=0,rowspan=1, columnspan=2, sticky='EW', pady=5, padx=5)
Label(root, text="ALARM TEXT_3").grid(row=2, column=0, sticky='EW', pady=5, padx=5)
Label(root, text="ALARM TEXT_4").grid(row=2, column=1, sticky='EW', pady=5, padx=5)
root.mainloop()

iokeyz 发表于 2021-11-16 12:26

cqwcns 发表于 2021-11-16 12:01
用gird不行吗?

这个例子gird是可以的。


我看了下你的代码,应该是
ttk.Separator(mainframe, orient=HORIZONTAL)
在框架中画,不是在 root 中
而且分隔符本身要占用一行的

cqwcns 发表于 2021-11-16 14:38

iokeyz 发表于 2021-11-16 12:26
我看了下你的代码,应该是
ttk.Separator(mainframe, orient=HORIZONTAL)
在框架中画,不是在 root 中
...

正解,又犯了一个低级错误,谢谢。

ttk.Separator(mainframe, orient=HORIZONTAL).grid(
            row=4, columnspan=3, sticky='W,E', pady=10)
页: [1]
查看完整版本: Python tkinter的灵异事件